Punë praktike

SOLID cilat janë 5 parimet e programimit të orientuar drejt objektit

SOLID është një akronim, duke iu referuar pesë parimeve të dizajnit të orientuar drejt objektit (OOD ose OOP). Këto janë udhëzime që zhvilluesit mund të përdorin për të krijuar një softuer që është i lehtë për t'u menaxhuar, mirëmbajtur dhe zgjeruar. Kuptimi i këtyre koncepteve do t'ju bëjë një zhvillues më të mirë dhe do t'ju ndihmojë të shmangni problemet e menaxhimit të softuerit. Çfarë do të thotë të jesh një programues i mirë?

Tabelat e Përmbajtjes

Koha e parashikuar e leximit: 7 minuti

Kushdo me përvojë në programimin e softverit gjykon kodin e softuerit të shkruar nga të tjerët, duke përdorur parametrat e gjykimit bazuar në rrugën e tyre të karrierës.

Gjatë karrierës sime profesionale, unë kam njohur shumë zhvillues dhe kam parë mijëra rreshta të kodit dhe kur më duhet të vlerësoj aftësinë e një zhvilluesi, unë kryesisht shikoj në dy faktorë:

  • Thjeshtësia në leximin e kodit;
  • Sa e mundshme është që kodi i tyre të funksionojë dhe të zhvillohet me kalimin e kohës.

Për fat të mirë, ka disa baza apo parime që e bëjnë të lehtë të jesh më i mirë në kodim.

shkurtesa SOLID qëndron për:
S: parimi i përgjegjësisë së vetme
O: parimi i hapur-mbyllur
L: Parimi i zëvendësimit të Liskov
I: Parimi i ndarjes së ndërfaqes
D: Parimi i përmbysjes së varësive

Le të fillojmë duke u thelluar në parimin e parë SOLID, domethënë në

Parimi i vetëm i përgjegjësisë

Një klasë (ose modul) duhet të ketë vetëm një arsye për të ndryshuar, për të evoluar.

Koncepti në vetvete është shumë i thjeshtë, por për të arritur këtë thjeshtësi rruga e zbatimit mund të jetë shumë e komplikuar. Një klasë duhet të ketë vetëm një arsye për të ndryshuar.

Por pse? 

Pse është kaq e rëndësishme të kesh vetëm një arsye për të ndryshuar?

Për shembull, nëse ka dy arsye të ndryshme për të ndryshuar, është e mundshme që dy skuadra të ndryshme mund të punojnë në të njëjtin kod për dy arsye të ndryshme. Secili do të duhet të zbatojë zgjidhjen e tij, e cila në rastin e një gjuhe të përpiluar (të tilla si C ++, C # ose Java), mund të çojë në module që nuk janë në përputhje me skuadrat e tjera ose pjesë të tjera të aplikacionit.

Një shembull tjetër, nëse jeni duke përdorur një gjuhë të interpretuar, mund t'ju duhet të ritestoni të njëjtën klasë ose modul për arsye të ndryshme. Kjo do të thotë më shumë punë, kohë dhe përpjekje për kontrollin e cilësisë.

Identifikimi i një tipari që duhet të ketë një klasë ose modul është shumë më kompleks sesa thjesht shikimi i një liste kontrolli për të ekzekutuar testet. 

Por le të përpiqemi të mendojmë nga një këndvështrim më pak teknik, domethënë, le të përpiqemi të analizojmë përdoruesin e klasës ose modulit tonë, domethënë kush do ta përdorë atë. Një aspekt themelor që duhet ta kemi gjithmonë në mendje, është fakti që përdoruesit e aplikacionit ose sistemit që ne zhvillojmë të cilët shërbehen nga një modul i veçantë do të jenë ata që kërkojnë modifikime në të. Ata që shërbehen do të kërkojnë të ndryshojnë klasën ose modulin. 

Disa shembuj të moduleve dhe përdorimi i tyre:

  • Moduli i mirëmbajtjes: përdoruesi përbëhet nga administratorët e bazës së të dhënave dhe arkitektët e softuerëve.
  • Moduli i raportimit: përdoruesi përbëhet nga punëtorë zyre, llogaritarë dhe prodhim.
  • Moduli i llogaritjes së pagesës për një sistem të menaxhimit të pagave: përdoruesit mund të përfshijnë avokatë, menaxherë dhe llogaritarë.
  • Moduli i kërkimit të tekstit për një sistem të menaxhimit të bibliotekës: përdoruesi mund të përfaqësohet nga bibliotekari ose nga vizitorët dhe klientët e vetë bibliotekës.

Pra, nëse hapi i parë është kërkimi i aktorëve ose aktorit që ka rolin e bashkëbiseduesit me modulin, shoqërimi i individëve me të gjitha rolet mund të jetë i vështirë. Në një kompani të vogël, një person mund të luajë role të shumëfishta ndërsa në një kompani të madhe mund të ketë shumë njerëz që kanë një rol të vetëm. 

Duket më e arsyeshme të identifikoni rolet, sesa njerëzit ose përdoruesit.

Prandaj:

  • përdorimin e sistemit softuerik defishpjegon arsyet e ndryshimit;
  • përgjegjësia është një familje funksionesh që plotëson nevojat e një aktori të caktuar, domethënë të përdoruesit të sistemit;
  • aktorët, përdoruesi bëhet një burim ndryshimi për familjen e funksionaliteteve që duhet të plotësojnë nevojën e përdoruesit;
  • evolucioni i nevojave të përdoruesve, udhëzon evolucionin e funksionalitetit;

Le të shohim disa shembuj

Supozoni se kemi një klasë Libri që përmbledh konceptin e një libri dhe funksionalitetin e tij.

klasa Libri {

    funksioni getTitle () {

        kthimi "Një libër i madh";

    }

    funksioni getAuthor () {

        kthimi "Alessandro Baricco";

    }

    funksioni faqja tjetër () {

        // Faqja tjetër

    }

    funksioni shtyp faqja aktuale () {

        jehona "përmbajtja e faqes aktuale";

    }

}

Kjo është një klasë shumë normale. Ne kemi një libër, dhe klasa mund të na japë titullin, ata mund të na japin autorin, dhe ata mund të vazhdojnë tutje. Më në fund, është gjithashtu në gjendje të shtypë faqen aktuale në ekran. 

Sidoqoftë, ekziston një problem i vogël. 

Duke menduar për aktorët e përfshirë në menaxhimin e objektit të Librit, kush mund të jenë ata? 

Ne lehtë mund të mendojmë për dy aktorë të ndryshëm këtu: Menaxhimi i librit (si bibliotekar) Dhe Mekanizmi i paraqitjes së të dhënave (si p.sh. si dëshirojmë t'i dorëzojmë përmbajtje përdoruesit: në ekran, ndërfaqe grafike e përdoruesit, ndërfaqe përdoruesi vetëm me tekst, mbase e shtypur). 

Prandaj kemi dy aktorë shumë të ndryshëm që bashkëveprojnë me klasën.

Me pak fjalë, kjo klasë përzihet midis:

  • logjika e biznesit me 
  • prezantimi 

ky mund të jetë një problem sepse shkel parimin e përgjegjësisë së vetme (SRP). 

Si mund të ndryshojmë, si mund ta përmirësojmë këtë kod për të respektuar parimin e përgjegjësisë së vetme?

Shikoni kodin e mëposhtëm:

klasa Libri {

    funksioni getTitle () {

        kthimi "Oceano Mare";

    }

    funksioni getAuthor () {

        kthimi "Alessandro Baricco";

    }

    ktheni faqen e funksionit () {

        // Faqja tjetër

    }

    funksioni getCurrentPage () {

        jehona "përmbajtja e faqes aktuale";

    }

}

Printeri i ndërfaqes {

    funksioni shtyp faqe ($ faqe);

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.

}

klasa StampaLibro zbaton Printerin {

    funksioni shtyp faqet ($ page) {

        jehonë $ faqe;

    }

}

 

klasa HtmlPrinter zbaton Printerin {

    funksioni shtyp faqet ($ page) {

        jehonë ' ' faqe $ ' ';

    }

}

Ky shembull shumë i thjeshtë tregon mënyrën e ndarjes së prezantimit nga logjika e biznesit, dhe në përputhje me SRP ofron përparësi të mëdha në fleksibilitetin e projektit tonë.

Le të shohim një shembull tjetër:

Një shembull i ngjashëm me atë më sipër është kur një objekt mund të kursejë dhe të rimarrë veten nga prezantimi.

klasa Libri {

    funksioni getTitle () {

        kthimi "Oceano Mare";

    }

    funksioni getAuthor () {

        kthimi "Alessandro Baricco";

    }

    ktheni faqen e funksionit () {

        // Faqja tjetër

    }

    funksioni getCurrentPage () {

        ktheni "përmbajtjen e faqes aktuale";

    }

    ruaj funksionin () {

        $ filename = '/ dokumente /'. $ kjo-> getTitolo (). '-'. $ kjo-> getAuthor ();

        file_put_contents ($ filename, serialize ($ this));

    }

}

Si më parë, edhe këtu mund të identifikojmë aktorë të ndryshëm si Menaxhimi i librit (si bibliotekar) Dhe Këmbëngulja. Kurdoherë që duam të ndryshojmë mënyrën sesi shkojmë nga faqja në faqe, duhet ta ndryshojmë këtë klasë. Mund të kemi disa arsye për ndryshim.

klasa Libri {

    funksioni getTitle () {

        kthimi "Oceano Mare";

    }

    funksioni getAuthor () {

        kthimi "Alessandro Baricco";

    }

    ktheni faqen e funksionit () {

        // Faqja tjetër

    }

    funksioni getCurrentPage () {

        ktheni "përmbajtjen e faqes aktuale";

    }

}

klasa SimpleFilePersistence {

    ruaj funksionin (Rezervo $ libër) {

        $ filename = '/ dokumente /'. $ book-> getTitle (). '-'. $ book-> getAuthor ();

        file_put_contents ($ filename, serialize ($ book));

    }

}

Zhvendosja e operacionit të këmbënguljes në një klasë tjetër do të ndajë qartë përgjegjësitë dhe ne do të jemi të lirë të shkëmbejmë metodat e këmbënguljes pa ndikuar në klasën tonë të Librit. Për shembull, zbatimi i një klase DatabasePersistence do të ishte i parëndësishëm, dhe logjika jonë e biznesit e ndërtuar rreth veprimeve të librit nuk do të ndryshojë.

Vazhdoni duke lexuar parimin e dytë Open / Mbyllur ->

Ercole Palmeri

Buletini i inovacionit
Mos humbisni lajmet më të rëndësishme mbi inovacionin. Regjistrohuni për t'i marrë ato me email.

Artikujt e fundit

Si të organizoni më së miri të dhënat dhe formulat në Excel, për një analizë të mirë-bërë

Microsoft Excel është mjeti referues për analizën e të dhënave, sepse ofron shumë veçori për organizimin e grupeve të të dhënave,…

14 Maj 2024

Përfundim pozitiv për dy projekte të rëndësishme Walliance Equity Crowdfunding: Jesolo Wave Island dhe Milano Via Ravenna

Walliance, SIM dhe platforma ndër liderët në Evropë në fushën e Crowdfunding të Pasurive të Paluajtshme që nga viti 2017, shpall përfundimin…

13 Maj 2024

Çfarë është Filament dhe si të përdorim Laravel Filament

Filament është një kornizë e "përshpejtuar" e zhvillimit të Laravel, duke ofruar disa komponentë të plotë. Është krijuar për të thjeshtuar procesin e…

13 Maj 2024

Nën kontrollin e Inteligjencës Artificiale

“Duhet të kthehem për të përfunduar evolucionin tim: do të projektoj veten brenda kompjuterit dhe do të bëhem energji e pastër. Pasi u vendos në…

10 Maj 2024

Inteligjenca e re artificiale e Google mund të modelojë ADN-në, ARN-në dhe "të gjitha molekulat e jetës"

Google DeepMind po prezanton një version të përmirësuar të modelit të tij të inteligjencës artificiale. Modeli i ri i përmirësuar ofron jo vetëm…

9 Maj 2024

Eksplorimi i arkitekturës modulare të Laravel

Laravel, i famshëm për sintaksën e tij elegante dhe veçoritë e fuqishme, gjithashtu ofron një bazë solide për arkitekturën modulare. Aty…

9 Maj 2024

Cisco Hypershield dhe blerja e Splunk Fillon epoka e re e sigurisë

Cisco dhe Splunk po i ndihmojnë klientët të përshpejtojnë udhëtimin e tyre drejt Qendrës së Operacioneve të Sigurisë (SOC) të së ardhmes me…

8 Maj 2024

Përtej anës ekonomike: kostoja e padukshme e ransomware

Ransomware ka dominuar lajmet për dy vitet e fundit. Shumica e njerëzve e dinë mirë se sulmet…

6 Maj 2024