Naipakita ang pattern ng disenyo: pattern ng diskarte



Sa blog na ito matutuklasan namin ang Disenyo ng Disenyo ng Disenyo, na ginagamit upang lumikha ng isang mapagpapalit na pamilya ng mga algorithm na maaaring mapili nang pabagu-bago.

'

Maligayang pagdating sa unang post ng seryeng 'Mga Disenyo ng Mga pattern sa Disenyo'. Sa seryeng ito ay matutuklasan namin ang bawat Disenyo ng Disenyo mula sa simula.





Ang simpleng kaalaman sa isang wika ng pagprograma at mga konstruksyon nito ay hindi ka gagawing mas mahusay na programmer o developer. Nangangailangan ito ng kaalaman sa Mga Disenyo ng Disenyo upang lumikha ng software na gagana ngayon at sa hinaharap din.

Maraming mga developer ang nakatagpo ng mga problema sa disenyo na iyong kinakaharap ngayon o haharapin sa hinaharap. Tinukoy nila ang isang karaniwang paraan ng pagharap sa problemang iyon. Kaya sa pamamagitan ng paggamit ng Mga pattern ng Disenyo makakakuha ka ng kalamangan sa paggamit ng napatunayan na mga diskarte.



Ang bawat Disenyo ng Disenyo ay para sa paglutas ng isang partikular na uri ng sitwasyon na maaaring may mga sitwasyon kung saan maaaring magamit ang higit sa isang Disenyo ng Disenyo.

Karamihan sa mga programmer ay sinusubukan lamang na malutas ang problemang kinakaharap na hindi nag-aalala tungkol sa mga pattern ng disenyo, kalabisan na code o kahit na mahigpit na pagkabit. Ngunit ang mahusay na mga programmer ay nagsisimulang magkakaiba. Iniisip nila ang tungkol sa mga kinakailangan ngayon, hinaharap na kinakailangan, pagpapanatili ng code at muling paggamit ng code.

Ang magagaling na programmer ay hindi nagmamadali upang simulan ang pag-coding sa sandaling makuha nila ang mga kinakailangan. Umupo sila at iniisip ang tungkol sa problema tungkol sa kung gagana ang kanilang disenyo. Kung oo, kung gagana ito makalipas ang 6 na buwan, kung kailan magbabago ang mga kinakailangan.



Ang mga magagaling na programmer ay kumukuha ng kanilang panulat at papel at nagsisimulang magdisenyo ng kanilang mga klase at ugnayan sa pagitan ng mga klase. Sinusubukan nilang makakuha ng maluwag na pagkabit at mataas na pagkakaisa sa kanilang disenyo, habang ginagawa ang lahat ng ito ay nasa isip nila ang Mga Prinsipyo na Nauugnay sa Bagay. Hindi sila kaagad pumapasok sa mababang antas ng code. Upang mag-disenyo ng kakayahang umangkop at magagamit muli na software, dapat mong sundin ang diskarte na ito kung hindi man ay palagi mong mahahanap ang iyong sarili sa pagbabago ng code na isinulat mo nang mas maaga.

Mayroon lamang isang bagay na pare-pareho sa industriya ng software at iyon ay Magbago Ang mga kinakailangan ay tiyak na patuloy na magbabago. Kaya paano namin idisenyo ang software na maaaring madaling iakma ng iyong code sa mga hinaharap sa hinaharap? Para doon kailangan mong magsimula nang maaga, at idisenyo ito sa paraang hindi masisira ng mga hinaharap na hinihintay ang iyong nakaraang code.

Paano ko magagawa iyon?

Kaya, magagawa ito sa pamamagitan ng pagsunod sa Mga Prinsipyo sa Disenyo at Mga pattern ng Disenyo batay sa mga prinsipyong iyon.

Ngayon, sumisid tayo sa pag-coding at magsimula sa paglalakbay upang maging isang mas mahusay na programmer. Sa post na ito, matutuklasan namin ang isa sa pinakamahalagang pattern - pattern ng diskarte .

Kapag sinabi kong ang pinakamahalaga ay sumasalamin ito sa karaniwang problema na nalulutas ng Diskarte sa Diskarte.

Ano ang pattern ng Diskarte?

Narito ang kahulugan nang diretso mula sa librong 'Gang of Four': β€œAng pattern ng Diskarte ay ginagamit upang lumikha ng isang mapagpapalit pamilya ng mga algorithm mula sa kung saan ang kinakailangang proseso ay napili sa run-time'.

Kung sakaling ikaw ayhindi maintindihan, huwag magalala, ipapaliwanag namin ito sa amas simpleparaanpara sa iyo naintindihin

Unawain muna natin ang problema at pagkatapos ay makikita natin kung paano malulutas iyon ng Diskarte sa Diskarte.

pag-iiskedyul ng round robin algorithm sa c

Sa diagram sa itaas ng UML, mayroon kaming klase ng abstract ng hayop at dalawang kongkretong klase, Aso at Ibon, na umaabot mula sa klase ng Animal super.

Kaya't tukuyin natin ang isang klase ng Animal abstract at dalawang kongkretong klase, Aso at Ibon.

Ano ang palagay mo tungkol sa disenyo sa itaas? Mayroong isang malaking pagkakamali sa aming disenyo.

Ang lahat ng mga hayop ay hindi maaaring lumipad, tulad ng sa itaas na kaso ang isang aso ay hindi maaaring lumipad. Ngunit mayroon pa rin itong pag-uugali na 'lumipad'.

Nagkamali kami sa pamamagitan ng pagsulat ng abstract fly () na pamamaraan sa loob ng klase ng Animal. Pipilitin ng disenyo na ito ang bawat sub-class na Aso, Ibon, Penguin, Crocodile, Gansa atbp upang magpatupad ng fly () na pamamaraan.

Dapat nating maunawaan na ang paglipad ay isang kakayahan na hindi lahat ng mga hayop ay magkakaroon. Sa pamamagitan ng pagbibigay ng fly () na pamamaraan sa klase ng Animal abstract itinakda namin ang kakayahang lumipad sa lahat ng mga sub-class na hindi tama para sa lahat ng mga sub-class ng mga hayop.

Maaari mong isipin kung ano ang problema sa pagpapatupad ng paraan ng paglipad sa mga sub-klase. Bagaman maaari mong ipatupad ang fly () na pamamaraan sa hindi lumilipad na mga sub-klase ng hayop upang mai-print lamang ang 'Hindi ako makalipad'. Ngunit ang problema ay, binibigyan mo pa rin ng pag-uugali ng paglipad sa mga hindi lumilipad na hayop. Hindi ito tama.

Ano ang pakiramdam na tawagan ang dog.fly () o crocodile.fly ().

Kaya, ngayon naiintindihan namin na ang aming disenyo ay hindi tama at dapat naming alisin ang fly () na pamamaraan mula sa Animal sub-class.

Ano ang iba pang paraan ng pagdidisenyo ng aming mga klase sa isang paraan na hindi ipinatutupad ng aming disenyo ang lahat ng mga sub-klase ng hayop na magkaroon ng pag-uugali sa paglipad.

Ang isang solusyon na agad na naisip ay maaari kaming gumawa ng isang lumilipad na interface na mayroong paraan ng paglipad at ang mga hayop lamang na maaaring lumipad ang magpapatupad ng interface na lumilipad. Sa ganitong paraan hindi namin ipapatupad ang lahat ng mga sub-klase ng hayop upang tukuyin ang isang pag-uugali sa paglipad. Kaya't i-code natin ang diskarte sa disenyo na ito.

Ngayon, ang aming klase sa Animal ay magiging hitsura ng code sa ibaba pagkatapos alisin ang mabilis na pamamaraan mula sa klase ng Animal.

Tukuyin natin ngayon ang interface na Lumilipad

Ngayon, ang klase ng Aso ay mababagobilangang code sa ibaba at hindi ito kailangang magkaroon ng pag-uugali ng paglipad.

Tingnan natin ang ilan sa aming mga Animal sub-class na magkakaroon ng pag-uugali sa paglipad.

Nalutas namin ang dati naming problema, ngunit nakarating kami sa isang bagong problema at iyon ang 'Pagdoble ng Code'.

Sabihin, magkakaroon tayo ng 100 magkakaibang mga klase ng paglipad na Hayop. Kailangan nating doblehin ang code para sa pag-uugali ng paglipad dahil ang paglipad na interface ay hindi maaaring magbigay ng anumang pagpapatupad para sa pag-uugali ng paglipad, at sa paglaon kung nais naming baguhin ang fly () na pagpapatupad ng pamamaraan sa anumang sub-klase kailangan naming buksan ang klase na iyon at baguhin ang code, alin ang masama Kulang kami ng isang bagay na malaki at, iyon ay, hindi natin mababago ang pag-uugali ng paglipad ng isang klase sa run-time.

Ngunit huwag mag-alala, ang Diskarte sa Diskarte ay naroroon upang makawala ka sa problemang ito.

Kaya't paganahin natin ang ating code upang magamit ang Diskarte sa Diskarte.

Ang lumilipad na interface ay mananatiling kapareho nito. Ngayon, sa halip na ang bawat lumilipad na sub-class na pagpapatupad ng lumilipad na interface mismo, tutukuyin namin ang magkakahiwalay na mga konkretong klase na magpapatupad ng iba't ibang pag-uugali sa paglipad. Tingnan natin kung paano ito gawin.

Kaya, kung paano ito gumagana lahat, tingnan natin ang TestClass

Sa pamamagitan ng paggamit ng Pattern ng Diskarte nagagawa naming baguhin ang pag-uugali ng paglipad ng anumang hayop sa run-time at iyon ay nang hindi ipinapatupad ang anumang mga sub-class upang tukuyin ang mismong pag-uugali ng paglipad.

Kailan gagamit ng pattern ng Diskarte?

Kapag nais mong mabago ang pag-uugali sa run-time na pabagu-bago.

Upang matiyak na malinaw mong naiintindihan ang Diskarte sa Diskarte kumuha tayo ng isa pang halimbawa.

Sa itaas na klase ng empleyado ay itinatakda namin ang bayad ng empleyado depende sa kanyang itinalaga. Kung ang isang empleyado ay isang 'Intern' nagdaragdag kami ng 10% na bonus sa pangunahing suweldo upang makalkula ang aktwal na bayad.

Kung ang isang empleyado ay isang 'Web Developer' nagdaragdag kami ng 20% ​​na bonus sa pangunahing suweldo upang makalkula ang aktwal na suweldo at sumusunod ang katulad na proseso para sa iba pang mga uri ng mga empleyado. Bagaman ang aming algorithm para sa pagkalkula ng aktwal na suweldo ay napaka-simple upang gawing mas madaling maunawaan ngunit sa karamihan ng oras, nagsasama ito ng maraming mga paghahambing at pagkalkula.

Kaya, ano ang mali sa code ng klase sa empleyado?

Kaya, ang code para sa pagkalkula ng bayad (getPay ()) ay static. Ipagpalagay na nais kong baguhin ang bonus para sa 'Intern' mula 10% hanggang 14%. Kailangan kong buksan ang code na empleyado-klase at palitan ito.

At isa pang problema ay hindi ko mababago ang algorithm ng bayad ng isang empleyado sa run-time. Kaya, paano ito magagawa? Ang pattern ng Diskarte ay partikular na ginagamit para sa paghawak ng ganitong uri ng problema.

I-refactor natin ang code upang magamit ang Diskarte sa Diskarte.

Tutukuyin ko ang maraming mga algorithm upang makalkula ang bayad. Pagkatapos ay makakagamit ako ng anuman sa mga algorithm na ito upang makalkula ang bayad sa run-time.

mga istruktura ng data at algorithm sa tutorial sa java

Ngayon, tingnan natin kung paano magbabago ang klase ng empleyado.

Tandaan: Inalis ko ang lohika ng pagkalkula ng bayad mula sa klase ng empleyado at lumikha ng isang itinakdang paraan ng PayAlgorithm () kung saan itatakda ko ang PayAlgorithm na nais kong gamitin para sa pagkalkula ng bayad.

Ito ay magbibigay sa akin ng kakayahang umangkop upang makalkula ang bayad sa pamamagitan ng pagtukoy ng anumang PayAlgorithm na pabagu-bago sa run-time. Gayundin, tandaan na sa paglaon kung kailangan kong baguhin ang lohika ng pagkalkula ng bayad maaari akong lumikha ng isang bagong PayAlgorithm at gamitin iyon upang makalkula ang bayad. Hindi ko kailangang baguhin ang dating code, hindi ba mahusay?

Kaya't tingnan natin ang paggana nito.

Inaasahan kong naintindihan mo nang maayos ang Diskarte sa Diskarte. Ang pinakamahusay na paraan upang malaman ang isang bagay ay sa pamamagitan ng pagsasanay.

Kung sakaling mayroon kang anumang mga query na nauugnay sa Diskarte sa Diskarte o anumang iba pang pattern, iwanan ang iyong mga query sa ibaba.

Panoorin ang susunod na post, kung saan matutuklasan namin ang isa sa pinakatanyag na Disenyo ng Disenyo, pattern ng Pabrika.

Hanggang sa gayon ay maaari mong i-download ang pag-play ng code kasama nito at siguraduhin na isemento mo ang Diskarte sa Diskarte sa iyong ulo.

May tanong ba sa amin? Nabanggit ang mga ito sa seksyon ng mga komento at babalikan ka namin.

Mga Kaugnay na Post: