относно капсулиране

10 отговора 314 прегледа
#1

относно капсулиране

Няколко книги за Java съветват да се използва пълно капсулиране на класовете, а достъпа до полетата им да се извършва с функции (методи). Въпросът ми е ЗАЩО? Отговорът в книгите е, че така се постига сигурност и абстрактност, защото полетата не са публични. Да, но чрез методите не могат ли по същия начин да се модифицират полетата? Тогава къде е кяра?
Мерси за отзивчивостта:)

Отговор
в отговор на нeo #2

Re: относно капсулиране

Predstawi si slednata situacia:
public class ccc {
public int ivar;

.......
}

i sled towa na 100 mesta w proekta zadawash stojnost na ivar.
Obache sled wreme reshawash che ivar triabwa da wawedesh prowerka i da mu priswoiawash stojnost kogato e po malko ot 0 da e 0. Kakwo prawish togawa: na 100 mesta pishesh: if (ivar<0) ivar=0;

----------------------------------------------
kogato e kapsulirano:

public class ccc {
private int ivar;

public void setIvar(int _ivar)
{
ivar = _ivar;

}
.......
}

posle slagash samo w methoda setIvar:
public void setIvar(int _ivar)
{
ivar = _ivar;
if (ivar<0) ivar=0;
}

i gotowo.

towa e obesnenie s prosti dumi. Po knigite ste namerish oste edna duzina predimstwa. A w golemite proekti mnogo chesto se sluchwat da se prawiat takiwa promeni.

Hajde sas zdrawe.

Отговор
в отговор на нeo #3

Re: относно капсулиране

Това не е въпрос засягащ само Java, а и всички ОО езици. Това е полезно, защото към едно и също поле на клас могат да се извършват различни операции за достъп, както и да се проверява валидността на данните когато се променят. Представи си нещо такова:

class Timer{
int seconds = 0; // seconds during the day
int date = 0; // days since a constant date
public void addSecond(int sec){...}
public void addHour(int sec){...}
public void setTime(String time){...}
}
и пр.
Вярно че примера е безсмислен - има си клас за датата и времето (it's rainin' man), но съм се срещал с реални примери при бази данни, където някое поле може да се представи по различни начини в приложението.

Отговор
в отговор на нeo #4

Re: относно капсулиране

kogato dostypa se izvyrshva prez methodite to vytreshnoto predstaviane e skrito za classovete koito izpolzvat dadeniq klas... ako iskash sled tova da promenish neshto (naprimer ot masiv da smenish neshto na Vector) ili kakvoto se setish vmesto da promenish 100000 reda kod (ili oshte po-losho - ako drugi hora izpolzvat tvoia class da triabva i te da promeniat svoite programi.... predstaviash li si ako Sun napraviat takova nestho kolko choveka triabva da sednat da si promeniqt programite :)) )...

Отговор
в отговор на sun #5

Re: относно капсулиране

Да, бе. Ако нещо ти се повтаря 100 пъти е по-добре да го напишеш веднъж и да го извикваш много пъти. Това наистина е при всички езици. Мерси за практичните съвети и хай със здраве:)

Отговор
в отговор на нeo #6

Re: относно капсулиране

Ami, te ne6tata sa malko po-zadalbo4eni may...
po-prinzip Java e ezik koito moje da te napravi mnogo marzeliv programist ili pak da te nau4i na vsi4ko - ot teb si zavisi. Ideqta na kapsuliraneto e edna - skrivane na implementation-a (na bg may e realizaciq) - palno realizirane na konzepziqta na OO-te ezici. Kogato pravi6 edin hubav i polezen class ti dava6 na horata na4in da go polzvat. Kak si go napisal ne e tqhna rabota! Vaznoto e kogato kaje6 "tozi method priema String i vra6ta Array" clasat ti da pravi to4no tova.
Ima mnogo polezni knigi za Java koito mogat da ti razqsnqt i dopalnqt predstavata za OO idei - pepora4vam ti "JAVA in nutshell" na O'Reilly
:o)

Y-e-e-e-a-a-a-h...
Отговор
в отговор на Kalin_M #7

Re: относно капсулиране

skrivaneto ne vinagi e hubawo neshto :)
spomniam si kakwi bozi beshe zabyrkal edin kolega w edno JSP, wikaiki niakakyv getter 20 pyti shtoto e pravil cut&paste ili shtoto go e myrzialo da obiaviava promenliva. A towa che getter-a e method na session bean i e remote call i hodi i do DB-to, za nego e bezinteresno :)

Отговор
в отговор на l #8

Re: относно капсулиране

Vse pak stava6e vapros za hubav i polezen class...

Y-e-e-e-a-a-a-h...
Отговор
в отговор на l #9

Re: относно капсулиране

То това май е често срещана грешка - хората си мислят, че ако метода е getXXX то той прави само return XXX. То ако беше така - тогава нямаше да има смисъл от капсулиране. Идеята е, че в този get може да се слага допълнителна функционалност - да вземе нещо от DB, от файл, от друг процес, да изчисли нещо, да направи някакви проверки и т.н. Така че, който ползва класа, не би трябвало да прави някакви предположения, че това е "евтина" операция. Ама хората май го забравят това и ги мързи да си декларират допълнителни променливи.
Аз затова от време на време си прегръщавам тези методи (get...) на нещо от сорта на calculate, generate, retrieve и т.н.

Отговор
в отговор на josarjan #10

Re: относно капсулиране

kakto i da gi krystish vinagi shte se nameri niakoi koito da gi izpolzva nepravilno :))
protiv glupostta ne e izmisleno lekarstvo... :))

imashe edna knijka "zakonite na myrfi za komputrite"
v neia se kazvashe "Po-dobre izkustven intelekt otkolkoto estestvena glupost"

Отговор
в отговор на Kalin_M #11

Re: относно капсулиране

Мерси за съвета за таз книжка. В сайта наистина пише суперлативи за нея, ама всичко е с парички, май... Така че ако знаеш дали мога да го изтегля от някъде for free или пък български вариант за купуване. Такава кника не съм виждал на пазара.

Отговор