JavaRush /Блоги Java /Random-TG /Гирандагон / Танзимкунандагон. Бад. Ва давра
angelina
Сатҳи

Гирандагон / Танзимкунандагон. Бад. Ва давра

Дар гурӯҳ нашр шудааст
Мақолаи Егор Бугаенко 19 сентябри соли 2014 | Интишор дар: Java Core Гирандагон / Танзимкунандагон.  Бад.  Ва нукта - 1 Ин баҳси кӯҳна аз ҷониби Аллен Холуб дар мақолаи машҳури худ дар соли 2003 оғоз шуда буд, Чаро усулҳои гетер ва сеттер бад ҳастанд - гирандаҳо/таъминкунандагон як намунаи зиддитеррористӣ мебошанд ва мо бояд аз онҳо канорагирӣ кунем, ё ин чизест, ки мо ҳастем? дар барномасозии ба an object нигаронидашуда лозим аст. Ман ду сенти худро ба ин муҳокима илова мекунам. Мазмуни матни зер ин аст: гетерҳо ва сеттерҳо таҷрибаи бад мебошанд; онҳое, ки онҳоро истифода мебаранд, узр надоранд. Аммо боз ҳам, барои пешгирӣ кардани нофаҳмӣ, ман аслан пешниҳод намекунам, ки истифодаи get/set бояд дар ҳар ҷое ки имконпазир бошад, пешгирӣ карда шавад. Не. Ман мегӯям, ки шумо ҳатто онҳоро ба codeи худ наздик накардаед . Гирандагон / Танзимкунандагон.  Бад.  Ва нуқтаи - 2Шумо дар бораи ин изҳорот чӣ фикр доред? Сазовори таваҷҷӯҳи шумо? Оё шумо дар тӯли 15 сол намунаи гирифтани/set-ро истифода мебаред ва шумо меъмори мӯҳтарами Java ҳастед? Ва шумо ҳатто намехоҳед, ки ин сафсатаҳои шахси бегонаро гӯш кунед? Хуб... Ман ҳиссиёти шуморо мефаҳмам. То он даме, ки бо китоби Дэвид Уэст "Тафаккури Объект" -и он беҳтарин китоб дар бораи барномасозии ба an object нигаронидашуда, ки ман то ҳол хондаам, ҳамин тавр ҳис мекардам. Пас лутфан. Ором шавед ва кӯшиш кунед, ки ман чизеро фаҳмонам. Мавзӯи баҳс дар ҷаҳони ба an object нигаронидашуда бар зидди "дастраскунандагон" (номи дигари қабулкунанда ва танзимкунанда) якчанд далелҳо мавҷуданд. Ва ҳамаи онҳо далелҳои хеле дурустанд. Биёед ба онҳо зуд назар андозем. Пурсед, нагӯед : Аллен Холуб мегӯяд, "маълумотеро, ки барои иҷрои коре лозим аст, напурсед; аз созмоне, ки ин маълумотро дорад, "пурсед" ки ин корро барои шумо иҷро кунад." Принсипи вайроншудаи инкапсуляция : Объектро дигар an objectҳо ҷудо кардан мумкин аст, зеро онҳо метавонанд тавассути танзимкунанда ҳама гуна маълумотро ба an object дохил кунанд. Объект танҳо наметавонад ҳолати худро ба таври кофӣ бехатар фаро гирад, зеро касе метавонад ин ҳолатро тағир диҳад. Тафсилоти татбиқи ошкоршуда : Агар шумо як an objectро аз an objectи дигар ба даст оред, пас мо ба тафсилоти татбиқи an objectи аввал аз ҳад зиёд такя мекунем. Агар фардо он тағир ёбад (масалан, намуди натиҷа), пас мо бояд codeро иваз кунем. Ҳамаи асосҳои дар боло зикршуда албатта маъно доранд, аммо ин нуктаи муҳимтаринро аз даст медиҳад. Фаҳмиши нодурусти асосӣ Аксарияти барномасозон боварӣ доранд, ки an object сохтори додаҳо бо усулҳо мебошад. Ман аз маколаи Божидар Божанов иктибос меорам: Гетеру сетор бад нест. Аммо аксари an objectҳое, ки барои онҳо қабулкунандаҳо ва танзимкунандагон сохта шудаанд, танҳо дорои маълумот мебошанд. Ин тасаввуроти нодуруст натиҷаи як нофаҳмии бузург аст! Объектҳо "танҳо маълумотро захира намекунанд". Объектҳо сохторҳои додаҳо бо усулҳои замимашуда нестанд. Ин мафҳуми "нигоҳдории маълумот" аз забонҳои ба an object нигаронидашуда ва забонҳои мурофиавӣ, бахусус C ва COBOL пайдо шудааст. Ман бори дигар такрор мекунам: an object на танҳо маҷмӯи унсурҳои додаҳо ва функсияҳое мебошад, ки онҳоро идора мекунанд. Объект an objectи маълумот нест. Пас чӣ? Бал ва саг Дар барномасозии воқеии ба an object нигаронидашуда, an objectҳо мисли ман ва шумо мавҷудоти зиндаанд. Онҳо организмҳои зинда мебошанд, ки рафтор, хосиятҳо ва давраи зиндагии худро доранд. Оё организми зинда метавонад сетер дошта бошад? Метавонед тубро ба саг часпонед ("мустаҳкам")? Фикр накунед. Аммо ин маҳз ҳамон чизест, ки порчаи codeи дар поён буда иҷро мекунад:
Dog dog = new Dog();
dog.setBall(new Ball());
Пас, чӣ тавр ба шумо маъқул аст? Оё шумо метавонед тӯбро аз саг берун кунед ("гиред")? Хуб, фарз кунем, ки шумо метавонед. Мабодо вай онро хӯрд ва шумо ӯро ҷарроҳӣ кардед. Дар ин ҳолат, ҳа, шумо метавонед тӯбро аз саг ба даст оред ("гиред"). Ин маҳз ҳамон чизест, ки ман дар бораи он гап мезанам:
Dog dog = new Dog();
Ball ball = dog.getBall();
Ё мисоли хандаовартаре:
Dog dog = new Dog();
dog.setWeight("23kg");
Оё шумо инро дар ҳаёти воқеӣ тасаввур карда метавонед? Оё чунин садо медиҳад, ки шумо ҳар рӯз менависед? Агар ҳа, пас шумо барномасози мурофиавӣ ҳастед. Танҳо эътироф кунед. Ин аст он чизе ки Дэвид Уэст дар саҳифаи 30-юми китоби худ мегӯяд: Қадами аввал дар табдил додани як таҳиягари бомуваффақияти мурофиавӣ ба таҳиягари муваффақи ҳадаф ин лоботомия аст. Оё ба шумо лоботомия лозим аст? Ба ман бешубҳа он лозим буд ва ман онро ҳангоми мутолиаи китоби Вест "Тафаккури an objectӣ" гирифтам. Тафаккури an objectивӣ Ба фикр кардан ба монанди ашё оғоз кунед ва шумо фавран ин усулҳоро тағир медиҳед. Ин аст он чизе ки шумо метавонед ба даст оред:
Dog dog = new Dog();
dog.take(new Ball());
Ball ball = dog.give();
Ҳоло мо ба саг ҳамчун ҳайвони воқеӣ муносибат мекунем, ки метавонад тӯбро аз мо бигирад ва агар хоҳиш кунем, онро баргардонад. Танҳо дар ҳолате, ман қайд мекунам, ки саг наметавонад NULL-ро баргардонад. Сагон танҳо намедонанд, ки NULL чист! Тафаккури an objectивӣ (фикр кардан) фавран истинодҳои NULL-ро аз рамзи шумо хориҷ мекунад. Гирандагон / Танзимкунандагон.  Бад.  Ва нукта - 3
Моҳӣ бо номи Ванда (1988) аз ҷониби Чарлз Кричтон
Илова бар ин, тафаккури an objectивӣ ба тағирнопазирии an object, ба монанди "вазни саг" дар мисоли мо оварда мерасонад. Шумо codeро чунин менависед:
Dog dog = new Dog("23kg");
int weight = dog.weight();
Саг як организми зиндаи бетағйир аст, ки ба касе имкон намедиҳад, ки вазн, андоза ё ном ва ғайраро тағир диҳад. Вай метавонад бо дархост, вазн ё номи худро "гӯяд". Дар усулҳои ҷамъиятӣ, ки дархостҳоро барои хосиятҳои муайяни "дохorи" an object фош мекунанд, ҳеҷ бадӣ нест. Аммо ин усулҳо "гирандагон" нестанд ва онҳо набояд ҳеҷ гоҳ префикси "даст" -ро қабул кунанд. Мо аз саг «намебарем». Мо номи ӯро намефаҳмем. Мо аз вай хохиш мекунем, ки номашро ба мо гуяд. Оё шумо фарқиятро мебинед? Мо дар ин ҷо ҳатто дар бораи семантика сухан намегӯем. Мо муносибати мурофиавиро ба барномарезӣ аз усули ба an object нигаронидашуда фарқ мекунем. Дар барномасозии мурофиавӣ мо бо додаҳо кор мекунем, онро идора мекунем, мегирем, танзим мекунем ва агар лозим бошад, нест мекунем. Мо масъул ҳастем ва маълумот танҳо як ҷузъи ғайрифаъол аст. Саг барои мо ҳеҷ чиз нест - он танҳо "маълумот дорад". Вай ҳаёти худро надорад. Мо метавонем озодона ҳама чизеро, ки ба мо лозим аст, аз он гирем (гирем) ва ҳама гуна маълумотро ба он гузорем (муқаррар кунем). Ҳамин тавр C, COBOL, Паскал ва дигар забонҳои мурофиавӣ кор мекунанд (кор карданд). Ва вазъият дар ҷаҳони ба an object нигаронидашуда комилан муқобил аст. Дар ин ҷо мо an objectҳоро ҳамчун организмҳои зинда бо санаи таваллуд ва лаҳзаи марги худ, бо шахсият ва одатҳои худ, агар хоҳед, баррасӣ мекунем. Мо метавонем аз саг хоҳиш кунем, ки ба мо як пораи маълумот диҳад (масалан, вазни он) ва он метавонад маълумотро ба мо баргардонад. Аммо ҳамеша дар хотир доред, ки саг ҷузъи фаъол аст. Вай тасмим мегирад, ки пас аз дархост чӣ мешавад. Ва аз ин рӯ, барои усулҳои an object бо маҷмӯи ё гирифтан оғоз кардан комилан нодуруст аст. Ва ин ҳатто дар бораи вайрон кардани инкапсуляция нест, тавре ки бисёриҳо фикр мекунанд. Ин дар бораи он аст, ки шумо ё мисли an object фикр мекунед ё шумо ҳоло ҳам COBOL-ро бо синтаксиси Java менависед. PS . Ва ҳа, шумо метавонед пурсед: "Дар бораи JavaBeans, JPA, JAXB ва бисёр дигар API-ҳои Java, ки аз гирифтани/маҷмӯа вобастаанд, чӣ гуфтан мумкин аст?" Дар бораи функсияи дарунсохт дар Ruby, ки эҷоди аксессуарҳоро осон мекунад, чӣ гуфтан мумкин аст? Хайр, ба ту чй гуям... бахти ту аз дастат. Дар ҷаҳони ибтидоии COBOL-и мурофиавӣ мондан нисбат ба фаҳмидан ва қабул кардани ҷаҳони аҷиби an objectҳои воқеӣ хеле осонтар аст. P.P.S. _ Ман фаромӯш кардам, ки бигӯям, бале, ворид кардани вобастагӣ тавассути танзимкунанда низ як намунаи даҳшатнок аст. Аммо бештар дар ин бора дар мақолаи навбатӣ! Мақолаи аслӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION