Въпрос относно енкапсулацията, properties и fields


5
Здравейте, колеги!

Пиша домашни за курса по ООП и бих искал да попитам следното:

Създавам си собствен generic list class, или generic matrix, generic array, няма значение, понеже въпросът ми е принципен. Пазя си информацията в private field, било то private List



Отговори



1
Щом не ти трябва да показваш съответното поле на потребителя и няма да валидираш, значи няма нужда от пропърти. Точно тези две неща са смисъла на пропъртитата. Поне доколкото ги разбирам нещата ;) Имаше нещо подобно във видеото на Кенов за generics (Deque) - един масив data, който се използва само като вътрешно поле и по никакъв начин не се показва на потребителя => няма пропърти

от Tanya2013 (426 точки)


0
Аз затова питам, понеже малко се обърках. Днеска на лекцията в демата Кенов показа как да даваме на getter-a копие от полето, а не самото поле, за да си пазим инфото от неочаквани външни намеси през пропъртита, та се върнах да си оправя домашното, което вече предадох. Замислих се обаче за кой дявол пиша собствени методи, които после юзърът ще заобикаля, за да си вика стандартните листовски методи през пропъртито, както той си знае, и да ми се прецаква цялата логика.
С още малко практика ще се изгладят нещата, иначе много се кефя на курса, става ми все по-интересно =)


0
Трябва да мислиш за собствената логика, която имплементираш. Например за List-a потребителя изобщо не го интересува отвътре дали има масив или не, а както Кенов няколко пъти спомена щом не му трябва значи не трябва изобщо да знае, че съществува. Ти и да му направиш някакво пропърти (било то с копие или не ) все тая - той може и да не знае какво да го прави, най-много да ти омаже нещо. То си е само за класа и само класа знае, че има такова нещо и какво да го прави. Надявам се ме разбра :D П.П. A това с копията се използва когато потребителя трябва да вижда масива/листа/колекцията/или там каквото е, но не искаш по никакъв начин той да може да го промени. Даваш му копието и си пазиш оригинала за класа

от Tanya2013 (426 точки)


1
Здравей.
Когато имаш инстанция на лист или масив, не трябва да се създава пропъти към него защото е безсмислено. Както си написал ти, имаш си директни методи, които да бъркат в този колекция.
Друг е въпроса за обикновените полета - пример име, възраст и т.н. Тук пропъртитата освен за правилна капсулация, служат и за валидация на самите данни. Няма как иначе да хвърлиш ексепшън,ако възрастта е по - малка от 0.
При полетата за масиви, тези валидации трябва да се извършват в методите. :)
За констати и readonly също не ти трябват пропъртита, те си иммат стойност и нма как да се промени. Но те трябва да са public, иначе не можеш да ги достъпваш.

от wooden_jesus (2128 точки)


2

Както казаха колегите, данните се енкапсулират само ако има такава нужда. Аз само ще допълня, че има такъв принцип защото практиката го налага. Малко са реалните проблеми, които не изискват валидация, която се прави в пропъртитата.

Има и друг вариант. Няма нужда да правиш пропъртита, ако боравиш с private field в метод от текущия клас, които използва тази private променлива без да я променя, а дори да я променя,юзера да няма директен достъп до тази промяна.

public void MaleOfFemale(string choise) // публичен метод

{

   Console.WriteLine("You chose: {0}", choise); // принтира избора

   if( choise == "Male") // скрито проверява избора 

   {

      this.isMale = true; // променя private променлива

   }

   else

   {

      this.isMale = false;

   }

}

 


от Plamen_Petkov (1255 точки)


2
Смисъла зад енкапсулацията и information hiding е да скриеш конкретната имплементация, а да показваш само методи, които биха те интересували. Звучи доста абстрактно и странно, но има доста просто обяснение. Да вземем например примера с generic list. Никой не би трябвало да го интересува и да знае какво използваш зад кулисите - дали е List, array, HashSet, LinkedList и т.н. Можеш просто да връщаш IEnumerable, който се имплементира от всички гореизброени. Това ти дава възможност да правиш промени в generic list-a, без да се променя начина по който се използва (потребителя вижда и използва IEnumerable във всички случаи и не знае и не го интересува дали е List, Array или нещо друго).

от gallumbits (2371 точки)