Незмінний об'єкт: відмінності між версіями

[неперевірена версія][перевірена версія]
Вилучено вміст Додано вміст
Addbot (обговорення | внесок)
м Вилучення 8 інтервікі, відтепер доступних на Вікіданих: d:q23828
Inna Z (обговорення | внесок)
Немає опису редагування
Рядок 1:
'''Незмі́нний об'є́кт'''&nbsp;— в [[об'єктно-орієнтоване програмування|об'єктно-орієнтованому програмуванні]], об'єкт, стан якого не може бути змінено після створення. На противагу незмінним, стан '''змінних об'єктів''' може змінюватись після створення. Об'єкт може бути як незмінним повністю, так і певні його атрибути можуть бути задекларовані незмінними, використовуючи, наприклад, декларацію <tt>const</tt> [[мова програмування|мови програмування]] [[C++]]. У деяких випадках, об'єкт вважається незмінним навіть тоді, коли змінюються деякі його внутрішні атрибути, за умови, що зовні його стан виглядає незмінним. Наприклад, об'єкт, який використовує запам'ятовування результатів проміжних обчислень для кешування результатів складних обчислень, може вважатись незмінним. Початковий стан незмінного об'єкта, як правило, визначається [[Життєвий цикл об'єкта|під час створення об'єкта]], але, він може, також, визначатись безпосередньо перед використанням об'єкта.
 
Часто, незмінні об'єкти можуть бути корисними через те, що вони дозволяють уникнути деяких дорогих операцій копіювання та порівняння, полегшуючи, в такий спосіб, вихідний код програми, та пришвидшуючиприскорюючи її роботу. Однак, у деяких випадках, незмінність об'єкта може заважати, наприклад, якщо об'єкт містить велику кількість змінних даних. Через це, багато [[мова програмування|мов програмування]] мають можливості роботи як із змінними, так і з незмінними об'єктами.
 
Незмінні об'єкти часто бувають корисними завдяки тому, що вони по суті [[Багатонитева безпека|потоко-безпечні]].<ref name=Goetz>Goetz et al. ''Java Concurrency in Practice''. Addison Wesley Professional, 2006, Section 3.4. Immutability</ref> Інша перевага в тому, що вони є простішими для розуміння і пропонують більш високий рівень безпеки, ніж змінювані об'єкти.<ref name=Goetz/>
 
==Реалізація==
Незмінність об'єкту не означає, що фізична [[Комп'ютерна пам'ять|пам'ять]] в якій зберігається об'єкт не має доступу для запису. Скоріше, властивість бути незмінним йому задається під час компіляції у вигляді конструкції, яка вказує програмісту що можна робити з об'єктом через його інтерфейс, не зважаючи на те, що в абсолютній ситуації він може змінити його (наприклад, в обхід системи типів або порушуючи [[Стала (програмування)|константність]] в [[C (мова програмування)|C]] або [[C++]]).
 
===C++===
В C++, реалізація [[Стала (програмування)|константності]] класу <code>Cart</code> дозволено створювати нові екземпляри класу незмінними, з використанням ключового слова <code>const</code> (незмінний) або змінним, за бажанням, забезпечуючи дві різні версії методу <code>getItems()</code>.
(Відмітимо, що в C++ це не обов'язково &mdash; і фактично не можливо &mdash; створити спеціалізований конструктор для незмінних екземплярів <code>const</code>.)
 
<source lang="cpp">
template<typename T>
class Cart {
private:
std::vector<T> items;
 
public:
Cart(const std::vector<T>& v): items(v) { }
 
std::vector<T>& getItems() { return items; }
const std::vector<T>& getItems() const { return items; }
int total() const { /* повертає суму */ }
};
</source>
 
Якби в класі було поле, яке є вказівником чи посиланням на інший об'єкт, то все одно можливо змінювати об'єкт, на який посилається такий вказівник або посилання в константному методі, без помилки порушення константності. Можна стверджувати, що об'єкт в такому випадку не є цілком незмінним. C++ також забезпечує абстрактну незмінність (на відміну від незмінності даних) за допомогою ключового слова <code>mutable</code>, що дозволяє змінювати змінну член класу в середині методу, що оголошений як <code>const</code>.
 
<source lang="cpp">
template<typename T>
class Cart {
private:
std::vector<T> items;
mutable int costInCents;
mutable bool totaled;
 
public:
Cart(const std::vector<T>& v): items(v), totaled(false) { }
 
const std::vector<T>& getItems() const { return items; }
int total() const {
if (!totaled) {
costInCents = 0;
for (std::vector<T>::const_iterator itor = items.begin(); itor != items.end(); ++itor)
costInCents += itor->costInCents();
 
totaled = true;
}
return costInCents;
}
};
</source>
 
== Джерела інформації ==
* [http://en.wikipedia.org/w/index.php?title=Immutable_object&oldid=75605442 Immutable object]&nbsp;— стаття на англомовній вікіпедії.
 
== Примітки ==
{{reflist}}
 
== Див. також ==