
Ma sageli kohtan arendajaid, kes ei ole kuulnud SOLIDi pĂ”himĂ”tetest (me . â Toim.) vĂ”i objektorienteeritud programmeerimisest (OOP), vĂ”i on kuulnud, kuid ei kasuta neid praktikas. Selles artiklis kĂ€sitletakse OOP pĂ”himĂ”tete eeliseid, mis aitavad arendajal tema igapĂ€evases töös. MĂ”ned neist on hĂ€sti tuntud, teised mitte nii vĂ€ga, seega on artikkel kasulik nii algajatele kui ka kogenenud programmeerijatele.
Tuletame meelde: kĂ”ikidele "Habbra" lugejatele â 10 000 rubla allahindlus, kui registreerite end Skillboxi kursusele promokoodiga "Habr".
Skillbox soovitab: Haridusalane veebikursus .
DRY (Ăra Korda End)
Suhteliselt lihtne pĂ”himĂ”te, mille olemus on selge juba nimest: "Ăra korda end". Programmeerija jaoks tĂ€hendab see vajadust vĂ€ltida dubleeritud koodi ja vĂ”imalust kasutada töös abstraktsioone.
Kui koodis on kaks korduvat osa, tuleks need liita ĂŒheks meetodiks. Kui kindel vÀÀrtus on kasutusel rohkem kui ĂŒks kord, tasub see muundada avalikuks konstantsiks.
See on vajalik, et lihtsustada koodi ja teha selle hooldamine kergemaks, mis on OOP pÔhiline eesmÀrk. Liialdamine liitmisega ei ole ka soovitatav, kuna sama kood ei saa samaaegselt toimida nii OrderId kui ka SSN-iga.
Muutuste kapseldamine
Enamiku ettevÔtete tarkvaraproduktid arenevad pidevalt. See tÀhendab, et koodi tuleb muuta, seda peab hooldama. Oma elu lihtsustamiseks saab kasutada kapseldamist. See vÔimaldab tÔhusamalt testida ja hooldada olemasolevat koodibaasi. .
Kui kirjutate Java keeles, siis .
Avatuse/suletuse pÔhimÔte
Seda pĂ”himĂ”tet on lihtne meeles pidada, lugedes jĂ€rgmist vĂ€idet: "Tarkvarased ĂŒksused (klassid, moodulid, funktsioonid jne) peaksid olema avatud laiendamiseks, kuid suletud muutmiseks". Praktikas tĂ€hendab see, et nad vĂ”ivad vĂ”imaldada oma kĂ€itumise muutmist ilma algkoodi muutmiseta.
PĂ”himĂ”te on oluline, kui algkodi muutmine nĂ”uab selle ĂŒlevaatamist, moodulitestimist ja muid menetlusi. Kood, mis jĂ€rgib avatuse/suletuse pĂ”himĂ”tet, ei muutu laiendamisel, seega on selle kasutamisel mĂ€rgatavalt vĂ€hem probleeme.
Siin on kood, mis rikub seda pÔhimÔtet.

Kui on vaja midagi muuta, vÔtab see palju aega, kuna tuleb muuta kÔiki koodilÔike, mis on seotud vajaliku fragmentiga.
Muide, avatus-sulgumine on ĂŒks SOLID-i pĂ”himĂ”tteid.
Ăksikule vastutusele vastav pĂ”himĂ”te (SRP)
Veel ĂŒks pĂ”himĂ”te SOLID-i kogumist. See ĂŒtleb, et "klassil on vaid ĂŒks pĂ”hjus, miks seda muuta". Klass tĂ€idab ainult ĂŒhte ĂŒlesannet. Tal vĂ”ivad olla mitmed meetodid, kuid igaĂŒht kasutatakse ĂŒksnes ĂŒldise ĂŒlesande lahendamiseks. KĂ”ik meetodid ja omadused peavad teenima ainult seda.

Selle pĂ”himĂ”tte vÀÀrtus seisneb selles, et see nĂ”rgendab seoseid eraldi tarkvarakomponentide ja koodi vahel. Kui klassis saada rohkem kui ĂŒks funktsionaalsus, tekitab see seose kahe funktsiooni vahel. Nii et kui ĂŒht neist muuta, on suur tĂ”enĂ€osus, et rikkuda teist, mis on esimesele seotud. See tĂ€hendab testimistsĂŒklite arvu suurenemist, et tuvastada kĂ”ik probleemid eelnevalt.
SÔltuvuste pööramise pÔhimÔte (DIP)

Ălaltoodud koodinĂ€ide, kus AppManager sĂ”ltub EventLogWriter'ist, mis on omakorda tihedalt seotud AppManageriga. Kui on vaja teist viisi teavitamiseks, olgu see siis push, SMS vĂ”i e-mail, tuleb muuta klassi AppManager.
Probleemi saab lahendada DIP abil. Seega, selle asemel, et kĂŒsida AppManagerilt, kĂŒsime EventLogWriter'ilt, mis viiakse ellu raamistikuga.
DIP vĂ”imaldab hĂ”lpsasti asendada ĂŒksikuid mooduleid teistega, muutes sĂ”ltuvuse moodulit. See vĂ”imaldab muuta ĂŒhte moodulit, mĂ”jutamata teisi.
Koostamine, mitte pÀrimine
Peamised viisid koodi taaskasutamiseks on pÀrimine ja koostamine, kummalgi on oma eelised ja puudused. Tavaliselt eelistatakse teist, kuna see on paindlikum.
Koostamine vĂ”imaldab klassi kĂ€itumist muuta kĂ€itamise ajal, seadistades selle omadusi. Interfaiside rakendamisel kasutatakse polĂŒmorfismi, mis annab paindlikuma rakenduse.
Isegi Joshua Bloch "Effective Java"-s soovitab eelistada koostamist mitte pÀrimist.
Barbara Liskovi asenduspÔhimÔte (LSP)
Veel ĂŒks SOLID tööriistade pĂ”himĂ”te. See ĂŒtleb, et alamtĂŒĂŒbid peavad olema asendatavad supertĂŒĂŒbiga. See tĂ€hendab, et meetodid ja funktsioonid, mis töötavad superklassiga, peavad saama probleemideta töötada ka selle alams klassidega.
LSP on seotud nii ĂŒhe vastutuse pĂ”himĂ”tte kui ka vastutuse jagamise pĂ”himĂ”ttega. Kui klass pakub rohkem funktsionaalsust kui alams klass, siis viimane ei toeta mĂ”ningaid funktsioone, rikkudes sellega seda pĂ”himĂ”tet.
Siin on koodilÔik, mis rikub LSP-d.

Meetod area(Rectangle r) arvutab nelinurga pindala. Programm ebaÔnnestub pÀrast Square'i tÀitmist, kuna Square ei ole siin nelinurk. Vastavalt LSP pÔhimÔttele peavad funktsioonid, mis kasutavad pÔhiklassi viiteid, olema vÔimelised kasutama ka tuletatud klasside objekte ilma lisainstruktsioonideta.
See pĂ”himĂ”te, mis on alamtĂŒĂŒbi spetsiifiline mÀÀratlemine, pakkus vĂ€lja Barbara Liskov 1987. aastal konverentsil, kus tema peaettekanne oli 'Andmete abstraktsioon ja hierarhia' â seetĂ”ttu see nime saanud.
Liidese jagamise pÔhimÔte (ISP)
JĂ€lle ĂŒks SOLID pĂ”himĂ”te. Selle kohaselt ei tohi liidest, mida ei kasutata, rakendada. Selle pĂ”himĂ”tte jĂ€rgimine aitab sĂŒsteemil jÀÀda paindlikuks ja reguleeritavaks, kui muudetakse tööloogikat.
Seda olukorda esineb kĂ”ige sagedamini, kui liides sisaldab mitut funktsionaalsust, kusjuures kliendile on vajalik ainult ĂŒks neist.
Kuna liidese kirjutamine on keeruline ĂŒlesanne, on pĂ€rast töö lĂ”petamist sellele muutmine, rikkumata midagi, probleem.
ISP pÔhimÔtte eelis Java-s on see, et esmalt peate rakendama kÔik meetodid ja alles siis saavad neid kasutada klassid. SeetÔttu annab pÔhimÔte vÔimaluse vÀhendada meetodite arvu.

Programmeerimine liidese, mitte rakenduse jÀrgi
Siit on kÔik arusaadav nime jÀrgi. Selle pÔhimÔtte rakendamine toob kaasa paindliku koodi loomise, mis suudab töötada igasuguste uute liidese rakendustega.
Tuleb kasutada liidese tĂŒĂŒpi muutujaid, tagastatavaid tĂŒĂŒpe vĂ”i meetodi argumentide tĂŒĂŒpe. NĂ€ide â kasutamine SuperClass'i asemel SubClass'i.
Kusjuures:
List numbers= getNumbers();
Ja mitte:
ArrayList numbers = getNumbers();
Siin on praktiline rakendus sellest, millest eelnevalt rÀÀgiti.

Delegatsiooni pÔhimÔte
Levinud nÀide on meetodid equals() ja hashCode() Java-s. Kui tuleb vÔrrelda kaht objekti, delegeeritakse see toiming vastavale klassile, mitte kliendile.
PĂ”himĂ”tte eelisteks on koodi dubleerimise vĂ€ltimine ja suhteliselt lihtne kĂ€itumise muutmine. Samuti on see rakendatav sĂŒndmuste delegeerimiseks.

KÔik need pÔhimÔtted vÔimaldavad kirjutada paindlikumat, ilusamat ja usaldusvÀÀrsemat koodi, millel on kÔrge seos ja madal sidusus. Loomulikult on teooria tore, kuid et arendaja hakkaks tÔeliselt kasutama omandatud teadmisi, on vajalik praktika. JÀrgmine samm pÀrast OOP pÔhimÔtete omandamist vÔib olla tarkvaraarenduse levinud probleemide lahendamiseks mÔeldud disainimustrite uurimine.
Skillbox soovitab:
- Praktiline kursus .
- Rakenduslik veebikursus .
- Kaks aastat praktilist kursust .
Allikas: habr.com
