Мақолаҳо

Мувофиқи принсипи SOLID кушода / пӯшида

Субъектҳои нармафзор (синфҳо, модулҳо, функсияҳо ва ғ.) Бояд барои васеъкунӣ кушода бошанд, аммо барои таҳрир пӯшидаанд.

Тарҳрезии нармафзор: модулҳо, синфҳо ва функсияҳо тавре тарҳрезӣ карда шаванд, ки ҳангоми зарурати фаъолияти нав мо бояд коди мавҷударо тағир надиҳем, балки коди наверо нависем, ки онро коди мавҷуда истифода хоҳад бурд. Ин метавонад аҷиб ба назар расад, хусусан бо забонҳое, ба монанди Java, C, C ++ ё C #, ки он на танҳо ба худи рамзи манбаъ, балки ба дуӣ низ дахл дорад. Мо мехоҳем хусусиятҳои навро бо роҳҳое эҷод кунем, ки тақсимоти дутарафа, иҷрошаванда ё DLL-ҳои мавҷударо талаб накунанд.
OCP дар заминаи SOLID

 

SRP ва OCP иловагӣ

Мо аллакай принсипи SRP масъулияти ягонаро дидаем, ки дар он гуфта мешавад, ки модул бояд танҳо як сабаби тағирро дошта бошад. Принсипҳои OCP ва SRP иловагӣ мебошанд. Рамзе, ки тибқи принсипи SRP таҳия шудааст, инчунин ба принсипҳои OCP эҳтиром хоҳад гузошт. Вақте ки мо код дорем, ки танҳо як сабаби тағир доданро дорад, ҷорӣ кардани функсияи нав сабаби дуюмдараҷаи ин тағиротро ба вуҷуд меорад. Пас, ҳам SRP ва ҳам OCP вайрон карда мешаванд. Ба ҳамин монанд, агар мо коде дошта бошем, ки он бояд танҳо ҳангоми тағир ёфтани вазифаи асосии он тағир ёбад ва ҳангоми илова шудани функсияҳои нав бетағйир боқӣ монад, бинобар ин, ба OCP эҳтиром дошта бошад, он асосан ба SRP низ эҳтиром хоҳад гузошт.
Ин маънои онро надорад, ки SRP ҳамеша ба OCP мебарад ё баръакс, аммо дар аксари ҳолатҳо, агар яке аз онҳо иҷро карда шавад, расидан ба дуюм хеле содда аст.

 

Мисоли вайрон кардани принсипи OCP

Аз нуқтаи назари сирф техникӣ, Принсипи Кушодан / Пӯшида хеле содда аст. Муносибати оддии байни ду синф, ба монанди як синф дар зер, принсипи OCP-ро вайрон мекунад.

Синфи корбар мустақиман синфи Мантиқро истифода мебарад. Агар ба мо лозим ояд, ки синфи дуввуми Мантиқро тавре ба роҳ монем, ки ҳам синфи ҳозира ва ҳам навро истифода барем, синфи мавҷудаи Мантиқро тағир додан лозим аст. Истифодабаранда мустақиман ба татбиқи мантиқ алоқаманд аст, ҳеҷ роҳе барои мо пешниҳод кардани мантиқи нав бидуни таъсир ба ҳозира вуҷуд надорад. Ва вақте ки мо дар бораи забонҳои статикӣ чопшуда сухан меронем, синфи корбар эҳтимолан тағиротҳоро низ талаб мекунад. Агар мо дар бораи забонҳои ҷамъовардашуда сӯҳбат кунем, бешубҳа ҳам иҷрошавандаи Истифодабаранда ва ҳам Мантиқи иҷрошаванда ё китобхонаи динамикӣ азнавсозӣ ва таҳвилро талаб мекунанд, беҳтараш аз имкон дурӣ ҷуст.

Бо истинод ба нақшаи қаблӣ, мо метавонем хулоса барорем, ки ҳар як синфе, ки бевосита синфи дигарро истифода мебарад, метавонад боиси вайрон шудани принсипи Open / Closed шавад. 
Фарз мекунем, ки мо мехоҳем як синфе бинависем, ки тавонад тавассути барномаи худ "фоизи" файли зеркашишударо таъмин кунад. Мо ду синфи асосӣ дорем, як Progress ва File, ва гумон мекунам, ки мо онҳоро ба таври зерин истифода барем:

 

function testItCanGetTheProgressOfAFileAsAPercent () {
     $ file = File new ();
     $ file-> length = 200;
     $ file-> sent = 100;
     $ progress = Progress new ($ файл);
     $ this-> assertEquals (50, $ progress-> getAsPercent ());
}

Дар ин рамз мо корбарони Progress ҳастем. Мо мехоҳем, ки новобаста аз андозаи воқеии парванда арзиши фоизро ба даст орем. Мо файлро ҳамчун манбаи иттилоот истифода мебарем. Файл дарозии байт ва майдоне дорад, ки онро фиристода меноманд, ки миқдори маълумотҳои ба зеркашанда фиристодашударо ифода мекунад. Мо фарқ надорем, ки чӣ гуна ин арзишҳо дар барнома нав карда мешаванд. Мо метавонем тахмин кунем, ки ин барои мо мантиқи ҷодугарӣ аст, бинобар ин дар озмоиш мо метавонем онҳоро ба таври возеҳ муқаррар кунем.

 

Синфи Файл {
     дарозии $ ҷамъиятӣ;
     $ ҷамъиятӣ фиристода шуд;
}

 

Синфи File танҳо як объекти оддии додаҳо мебошад, ки ду майдонро дар бар мегирад. Албатта, он инчунин бояд иттилоот ва рафтори дигарро дар бар гирад, ба монанди номи файл, роҳ, роҳи нисбӣ, директорияи ҳозира, намуд, иҷозатҳо ва ғайра.

 

пешрафти синф {

     файли $ хусусӣ;

     function __construct (Файл $ файл) {
          $ this-> file = $ файл;
     }

     Функсияи getAsPercent () {
          баргардонед $ this-> file-> sent * 100 / $ this-> file-> length;
     }

}

Прогресс танҳо як синфест, ки файлро дар конструктораш қабул мекунад. Барои возеҳӣ, мо намуди тағирёбандаро дар параметрҳои созанда муайян кардем. Дар Progress усули ягонаи муфид вуҷуд дорад, getAsPercent (), ки қиматҳо ва дарозии фиристодашударо аз Файл гирифта, ба фоиз табдил медиҳад. Содда ва он кор мекунад.

Ба назар чунин мерасад, ки ин рамз дуруст аст, аммо он принсипи Open / Closed-ро вайрон мекунад.

Аммо барои чӣ?

Ва чӣ тавр?

 

Биёед кӯшиш кунем, ки талаботро дигар кунем

Ҳар як барномае, ки бояд бо мурури замон рушд кунад, ба хусусиятҳои нав ниёз дорад. Хусусияти нав барои барномаи мо метавонад иҷозат диҳад, ки ба ҷои танҳо зеркашӣ кардани файлҳо мусиқии мусиқӣ имкон диҳад. Дарозии файл бо байт, давомнокии мусиқӣ дар сонияҳо ифода карда мешавад. Мо мехоҳем ба шунавандагони худ лавҳаи пешрафтро пешниҳод кунем, аммо оё мо метавонем синфи дар боло навишташударо дубора истифода барем?

Не мо наметавонем. Пешрафти мо ба File алоқаманд аст. Он метавонад танҳо маълумоти файлро идора кунад, гарчанде ки он низ метавонад ба мундариҷаи мусиқӣ татбиқ карда шавад. Аммо барои ин мо бояд онро тағир диҳем, мо бояд ба Progress мусиқӣ ва файлҳоро донад. Агар тарҳи мо ба OCP мувофиқат мекард, ба мо лозим намеояд, ки ба File ё Progress даст бизанем. Мо метавонистем пешрафти мавҷударо дубора истифода барем ва онро дар мусиқӣ татбиқ кунем.

 

Бюллетени инноватсионӣ
Муҳимтарин хабарҳоро дар бораи навоварӣ аз даст надиҳед. Барои гирифтани онҳо тавассути почтаи электронӣ обуна шавед.

Ҳалли имконпазир

Забонҳои бо роҳи динамикӣ чопшуда бартарии идоракунии намудҳои объектро дар вақти кор доранд. Ин ба мо имкон медиҳад, ки тобиши типиро аз созандаи Прогресс хориҷ намоем ва кодекс корашро идома хоҳад дод.

пешрафти синф {

     файли $ хусусӣ;

     function __construct ($ файл) {
         $ this-> file = $ файл;
     }

    Функсияи getAsPercent () {
         баргардонед $ this-> file-> sent * 100 / $ this-> file-> length;
     }

}

Ҳоло мо метавонем ҳама чизро дар Progress оғоз кунем. Ва бо ҳама чиз, ман маънои аслии чизеро дар назар дорам:

Мусиқии класс {

дарозии $ ҷамъиятӣ;
$ ҷамъиятӣ фиристода шуд;

рассом $ ҷамъиятӣ;
албоми оммавии $;
public $ releaseDate;

Функсияи getAlbumCoverFile () {
бозгаштан 'Тасвирҳо / Сарпӯшҳо /'. $ ин-> рассом. '/'. $ ин-> албом. '.png';
}
}

Ва синфи мусиқӣ ба монанди синфи боло комилан кор хоҳад кард. Мо метавонем онро бо озмоиши ба Файл монанд хеле осон санҷем.
function testItCanGetTheProgressOfAMusicStreamAsAPercent () {
$ music = Music нав ();
$ music-> length = 200;
$ music-> sent = 100;

$ progress = Progress new ($ music);

$ this-> assertEquals (50, $ progress-> getAsPercent ());
}

Пас, асосан ҳама мундариҷаи ченшавандаро бо синфи Progress истифода бурдан мумкин аст. Шояд мо бояд онро бо рамз бо тағир додани номи тағирёбанда баён кунем:

пешрафти синф {

хусусии $meturableContent;

Функсияи __construct ($ measureurableContent) {
$ this-> measureurableContent = $ measureurableContent;
}

Функсияи getAsPercent () {
баргардонед $ this-> measureurableContent-> sent * 100 / $ this-> measureurableContent-> length;
}

}

Вақте ки мо Файлро ҳамчун матои типӣ таъин кардем, мо нисбати он чизе, ки синфи мо идора карда метавонад, хушбин будем. Ин ошкоро буд ва агар чизи дигаре меомад, иштибоҳи бузурге ба мо мегуфт.

Uна синфе, ки усули синфи пойгоҳро бекор мекунад, ба тавре ки шартномаи синфи асосӣ аз ҷониби синфи ҳосилшуда риоя намешавад. 

Мо намехоҳем, ки кӯшиши даъват кардани усулҳо ё дастрасӣ ба майдонҳо ба объектҳое, ки ба шартномаи мо мувофиқат намекунанд, тамом шавем. Вақте ки мо чопи чопӣ доштем, шартнома онро муайян мекард. Майдонҳо ва усулҳои синфи File. Ҳоло, ки мо чизе надорем, мо метавонем чизе фиристем, ҳатто сатр ва ин ба хатогии бад оварда мерасонад.

Дар ҳоле ки натиҷаи ниҳоӣ дар ҳарду ҳолат яксон аст, яъне рамзи шикастани он, аввалин паёми хубе дод. Бо вуҷуди ин, ин хеле торик аст. Ягон роҳе барои донистани он нест, ки тағирёбанда чист - сатр дар ҳолати мо - ва кадом хосиятҳоро ҷустуҷӯ кардаанд ва наёфтаанд. Мушкилотро ислоҳ кардан ва ислоҳ кардан душвор аст. Барномасоз бояд синфи Прогрессро кушояд, онро хонад ва фаҳмад. Шартнома, дар ин ҳолат, вақте ки шумо ба таври возеҳ навиштани ҳуруфро нишон намедиҳед, ин аст defiбо рафтори «Прогресс». Ин як шартномаи пешбинишуда аст, ки танҳо ба Прогресс маълум аст. Дар мисоли мо чунин аст defiбо дастрасии ду майдон, фиристодашуда ва дарозӣ бо усули getAsPercent() анҷом дода мешавад. Дар ҳаёти воқеӣ шартномаи пешбинишуда метавонад хеле мураккаб ва душвор бошад, ки танҳо бо ҷустуҷӯи чанд сония дар синф пайдо шавад.

Ин қарор танҳо дар сурате тавсия дода мешавад, ки ҳеҷ яке аз маслиҳатҳои дигари зер ба осонӣ татбиқ карда нашавад ё онҳо тағироти ҷиддии меъмориро ба бор оранд, ки саъйро талаб намекунанд.

Ercole Palmeri

Бюллетени инноватсионӣ
Муҳимтарин хабарҳоро дар бораи навоварӣ аз даст надиҳед. Барои гирифтани онҳо тавассути почтаи электронӣ обуна шавед.

Мақолаҳои охирин

Дахолати инноватсионӣ дар воқеияти васеъшуда бо тамошобини Apple дар поликлиникаи Катания

Дар поликлиникаи Катания амалиёти офтальмопластика бо истифода аз намоишгари тиҷоратии Apple Vision Pro анҷом дода шуд…

3 Май 2024

Манфиатҳои ранг кардани саҳифаҳо барои кӯдакон - ҷаҳони ҷодугарӣ барои ҳама синну сол

Рушди малакаҳои хуби моторӣ тавассути рангкунӣ кӯдаконро ба малакаҳои мураккабтаре, ба мисли навиштан омода мекунад. Барои ранг кардан…

2 Май 2024

Оянда ин аст: Чӣ гуна саноати боркашонӣ иқтисоди ҷаҳонро инқилоб мекунад

Бахши баҳрӣ як қудрати воқеии иқтисодии ҷаҳонӣ аст, ки ба бозори 150 миллиард доллар ҳаракат кардааст ...

1 Май 2024

Ноширон ва OpenAI барои танзими ҷараёни иттилооте, ки тавассути зеҳни сунъӣ коркард мешаванд, созишнома имзо мекунанд

Рӯзи душанбеи гузашта рӯзномаи Financial Times бо OpenAI созишнома эълон кард. FT журналистикаи сатҳи ҷаҳонии худро иҷозатнома медиҳад…

30 апрел 2024

Инноватсияро ба забони худ хонед

Бюллетени инноватсионӣ
Муҳимтарин хабарҳоро дар бораи навоварӣ аз даст надиҳед. Барои гирифтани онҳо тавассути почтаи электронӣ обуна шавед.

Моро дунбол кунед