Je, msimbo mzuri wa HTML unaonekanaje? Jinsi ya kuandika msimbo safi na mzuri

Ili kufanya maelezo yote zaidi kuwa wazi kwako, pakua faili hii ya PDF au fungua tu picha hii kwenye kichupo kipya cha kivinjari chako.

Wakati mwingine inavutia kuzingatia ikiwa tovuti ambayo inaonekana nzuri hutumia "nzuri" kila wakati. nambari ya html, i.e. sahihi, muundo, bila makosa. Msimbo wa HTML ni aina ya sanaa. Haijaendelezwa na kutofautishwa kama lugha inayobadilika, na bado inaweza kuandikwa kwa umaridadi na ustadi kabisa.

Hapa kuna orodha ya vipengele hivyo vinavyoweza kutumiwa kubainisha iwapo msimbo umeandikwa kwa ustadi au la.

1.MAFUNDISHO iliyofafanuliwa vizuri. Mfuatano huu haukuruhusu tu kutambua msimbo wako, lakini pia "huambia" kivinjari jinsi ya kuonyesha ukurasa wako.

2. Sehemu nadhifu katika vitambulisho
Kichwa kimewekwa. Usimbaji umetangazwa. Karatasi za mtindo zimeunganishwa. Maandishi yamejumuishwa, lakini hayajaandikwa kikamilifu.

3. Kukabidhi kitambulisho kwa hati yako hukuruhusu kuunda sifa za CSS ambazo ni za kipekee kwa kila ukurasa. Kwa mfano, unaweza kutaka yako

tag ilionekana maalum, kwa mfano, kwenye ukurasa wa nyumbani. Katika laha yako ya mitindo ya CSS unaweza kuandika: #home h2() ili kufanikisha hili.

4. Menyu safi. Labda mara nyingi umeona orodha zikitumika kama menyu. Hii ni rahisi sana, kwa sababu ... inakupa uwezo wa kuidhibiti.

5. Kuambatanisha maudhui yote ya ukurasa katika lebo kuu

. Kipengee hiki kitakupa fursa ya kudhibiti kila kitu. Hiyo ni, unaweza kuweka upana wa juu na wa chini wa ukurasa.

6. Mambo muhimu yawekwe mwanzoni. Habari na matukio muhimu katika msimbo yanapaswa kuja kwanza, na menyu na maudhui yasiyo muhimu yanapaswa kuwekwa mwishoni.

7. "Kuingizwa" kwa vipengele vya tovuti. Vipengele vingi vya tovuti vinarudiwa kwenye kila ukurasa, ambayo inamaanisha wanahitaji kujumuishwa kwa kutumia amri ya php.

8. Kanuni lazima ziorodheshwe katika sehemu. Ikiwa kila sehemu ya msimbo imeingizwa ndani, muundo wa msimbo utakuwa wazi zaidi. Nambari ambayo imeachwa ikiwa imeunganishwa ni ngumu kusoma na kuelewa.

9. Vitambulisho sahihi vya kufunga. Usijumuishe lebo za mwisho katika lebo ambazo hazijaoanishwa, na hakikisha kuwa lebo zinazolingana zimefungwa.

10. Tumia vitambulisho vya kichwa. Matumizi ya vichwa ni muhimu kwa sababu ... zinaonyesha uongozi wa sehemu na kuzipa utaratibu zaidi.

12. Hakuna mitindo! Msimbo wako wa html unapaswa kuzingatia muundo na yaliyomo, sio muundo wa ukurasa! Weka mitindo yote katika faili tofauti ya CSS.

Nitatoa sheria za msingi ambazo zinapaswa kufuatiwa wakati wa kuendeleza msimbo, ili kwa wiki unaweza kuangalia kanuni na kuamua ni kazi gani ya kufanya nini. Faida nyingine ya kuandika msimbo unaosomeka ni urahisi wa kutafuta na kurekebisha makosa. Nitasema mara moja kwamba mifano ambayo ninaweka alama kama "sio sahihi" haimaanishi kuwa haifanyi kazi, lakini kwamba sio sahihi kutoka kwa mtazamo wa kuunda nambari inayoweza kusomeka.

1. Toa vigeu kutoka kwenye mabano

Wakati wote unapoonyesha maandishi kwenye skrini, vigeu kwenye mstari lazima viwekwe nje ya mabano. Hii sio rahisi tu kwa kutazama, lakini pia inafaa, kwani inasababisha pato la haraka kwenye skrini.

Mfano usio sahihi:

echo "Thamani ni $val"

Mfano sahihi:

mwangwi "Thamani ni ".$val

2. Hakikisha kutumia maoni

Kila kipengele kinapaswa kuelezewa kwa maoni mafupi ikiwezekana. Kila kipande, ikiwa unafikiri ni vigumu kutosha kuelewa, kinapaswa kuelezewa na maoni mafupi. Na kwa ujumla, maoni yanapaswa kuelezea kila kitu ambacho unaona ni muhimu. Lazima uamue mwenyewe ni aina gani ya maoni ungependa kutumia. Hii inaweza kuwa mstari mmoja wa maandishi, au kizuizi cha mistari, ambayo inaelezea madhumuni ya kazi, habari kuhusu mwandishi wake, nk.

3. Tumia toleo fupi la kitendakazi cha mwangwi. Kwa mfano, rekodi kama

inaweza kubadilishwa kwa urahisi na

4. Ikiwezekana, sogeza vizuizi vikubwa vya HTML nje ya miundo ya PHP. Usitumie vibaya kipengele cha php.

Mfano usio sahihi:

"; mwangwi "Nambari kabla ni ".($i - 1); mwangwi"
"; } ?>

Mfano sahihi:

Nambari ni
Nambari hapo awali

Tafadhali kumbuka kuwa miundo miwili ya php inafunguliwa hapa, na maandishi ya HTML yanaingizwa kati yao. Labda mfano huu hauonyeshi faida wazi ya kusonga maandishi nje ya muundo wa PHP, lakini kwa kweli, wakati unapaswa kukabiliana na meza, sheria hiyo inaweza kuwa muhimu sana.

5. Msimbo lazima ulinganishwe kuhusiana na vitalu.

Mfano usio sahihi:

Kumbuka, php sio Pascal na vizuizi vyake vya kuanza ... mwisho. Hapa kizuizi kinapaswa kufunguliwa kwenye mstari ule ule ambapo ilianza, na funga sambamba na mwanzo wa kizuizi:

6. Rahisisha miundo tata. Wagawanye katika rahisi.

Mfano usio sahihi:

$res = mysql_result(mysql_query("CHAGUA Nambari KUTOKA db"), 0, 0)

Mfano sahihi:

$query = mysql_query("CHAGUA Nambari KUTOKA db"); $res = mysql_result($query, 0, 0);

7. Tumia nafasi zaidi na mistari tupu.

Kwa kweli, hii ni kipengele muhimu sana cha kuandika msimbo unaoweza kusomeka. Nimeona watu wengine wakiacha mistari tupu na kutumia nafasi chache iwezekanavyo, wakidhani kwamba wanachukua nafasi ya ziada. Hili kimsingi si sahihi, kwani baiti za ziada zitamruhusu mtu mwingine kuokoa muda wa kuchanganua msimbo wa mtu mwingine.

Mfano usio sahihi:

Mfano sahihi:

8. Tumia njia za mkato kwa shughuli za hesabu na kamba.

Kumbuka kwamba +1 inaweza kubadilishwa na ++ kila wakati, na +n na +=n.

Mifano ya uingizwaji:

$i = $i + 1 ni sawa na $i++
$i = $i — 1 ni sawa na $i—
$i = $i + $n ni sawa na $i+=$n
$i = $i."hello" ni sawa na $i.="hello"

Nzuri mbaya

Unapokabiliwa na hitaji la kusimamia kazi za waandaaji programu wengine, unaanza kuelewa kuwa, pamoja na mambo ambayo watu hujifunza kwa urahisi na haraka, kuna shida ambazo zinahitaji wakati muhimu kusuluhisha.

Kwa haraka, unaweza kumfundisha mtu kutumia zana na nyaraka zinazohitajika, mawasiliano sahihi na mteja na ndani ya timu, kuweka malengo sahihi na kipaumbele (vizuri, bila shaka, kwa kiwango ambacho unamiliki haya yote mwenyewe).

Lakini linapokuja suala la msimbo halisi, mambo huwa kidogo sana. Ndiyo, unaweza kuonyesha pointi dhaifu, unaweza hata kueleza nini kibaya nao. Na wakati ujao pata hakiki na seti mpya ya shida.

Taaluma ya mtayarishaji programu, kama taaluma nyingine nyingi, inapaswa kujifunza kila siku kwa miaka kadhaa, na, kwa kiasi kikubwa, katika maisha ya mtu. Kwanza, unasimamia seti ya maarifa ya kimsingi kwa idadi ya kozi za muhula wa N, kisha unakanyaga kwa muda mrefu kwenye safu anuwai, kupitisha uzoefu wa wandugu wakubwa, soma mifano mzuri na mbaya (kwa sababu fulani, mbaya ni zaidi. kawaida).

Kuzungumza juu ya maarifa ya kimsingi, ikumbukwe kwamba uwezo wa kuandika msimbo mzuri wa kitaalam ni jambo ambalo, kwa sababu moja au nyingine, maarifa haya ya kimsingi ni ya kimsingi. Isiyojumuishwa. Badala yake, katika taasisi zinazohusika, na vile vile katika vitabu, tunaambiwa kuhusu algoriti, lugha, kanuni za OOP, muundo wa muundo...

Ndio, unahitaji kujua haya yote. Lakini wakati huo huo, uelewa wa jinsi msimbo mzuri unapaswa kuonekana kwa kawaida huonekana tayari na uzoefu wa vitendo (kawaida kwa digrii moja au nyingine mbaya) chini ya ukanda wa mtu. Na mradi maisha "yalikusukuma" sio tu na mifano ya juisi ya nambari mbaya, lakini pia na mifano inayofaa kuiga.

Hapa ndipo ugumu wote ulipo: wazo lako la msimbo "wenye heshima" na "nzuri" linategemea kabisa uzoefu wako wa kibinafsi kwa miaka mingi. Sasa jaribu kufikisha wazo hili kwa muda mfupi kwa mtu aliye na uzoefu tofauti kabisa au hata asiye na uzoefu kabisa.

Lakini ikiwa ubora wa nambari iliyoandikwa na watu wanaofanya kazi nasi ni muhimu sana kwetu, basi bado inafaa kujaribu!

2. Kwa nini tunahitaji msimbo mzuri?

Kwa kawaida, tunapofanyia kazi bidhaa maalum ya programu, sifa za urembo za msimbo sio jambo letu la kwanza.
Uzalishaji wetu, ubora wa utekelezaji wa utendaji, utulivu wa uendeshaji wake, uwezekano wa marekebisho na upanuzi, nk ni muhimu zaidi kwetu.

Lakini je, sifa za urembo za msimbo ni jambo linaloathiri vyema viashiria vilivyo hapo juu?
Jibu langu: ndiyo, na wakati huo huo, moja ya muhimu zaidi!

Hii ni kwa sababu msimbo mzuri, bila kujali tafsiri ya dhana ya uzuri, ina zifuatazo (kwa kiwango kimoja au nyingine zinazoweza kupunguzwa kwa kila mmoja) sifa muhimu zaidi:

  • Uwezo wa kusoma. Wale. uwezo, kwa kuangalia msimbo, kuelewa haraka algorithm iliyotekelezwa na kutathmini jinsi mpango utakavyofanya katika kesi fulani.
  • Udhibiti. Wale. uwezo wa kufanya marekebisho yanayohitajika kwa msimbo kwa muda mfupi iwezekanavyo, huku ukiepuka matokeo mabaya ya kutabirika na yasiyotabirika.
Kwa nini sifa hizi ni muhimu zaidi, na jinsi zinavyochangia kuboresha viashiria vilivyoonyeshwa mwanzoni mwa aya, nina hakika, ni dhahiri kwa mtu yeyote anayehusika katika programu.

Na sasa, ili kuhama kutoka kwa maneno ya jumla hadi maalum, wacha tufanye kinyume na tuseme kwamba inasomeka na inayoweza kudhibitiwa, ambayo kawaida tunaiona kama nzuri na iliyoandikwa kitaaluma. Ipasavyo, tutazingatia zaidi kujadili jinsi ya kufikia sifa hizi.

3. Kanuni tatu za msingi.

Kuendelea na kuwasilisha uzoefu wangu mwenyewe, ninaona kwamba, wakati nikifanya kazi juu ya usomaji na udhibiti wa kanuni yangu na ya watu wengine, hatua kwa hatua nilikuja kwenye ufahamu ufuatao.

Bila kujali lugha maalum ya programu na kazi zinazotatuliwa, ili kipande cha msimbo kiwe na sifa hizi mbili za kutosha, lazima iwe:

  • laini iwezekanavyo;
  • mfupi;
  • kujiandikisha.
Unaweza daima kuorodhesha vidokezo na mbinu mbalimbali ambazo zinaweza kutumika kufanya msimbo wako kuwa mzuri zaidi. Lakini ninasema kuwa matokeo bora zaidi, au angalau matokeo mazuri yanaweza kupatikana kwa kuzingatia kanuni hizi tatu.

4. Uwekaji mstari wa kanuni.

Inaonekana kwangu kwamba kati ya kanuni tatu za msingi, mstari ni usio wazi zaidi, na ndio ambao mara nyingi hupuuzwa.
Labda kwa sababu kwa miaka mingi ya masomo (na, ikiwezekana, shughuli za kisayansi) tumezoea kujadili algoriti zisizo za kawaida na makadirio kama vile. O(n3), O(nlogn) na kadhalika.

Hii ni yote, bila shaka, nzuri na muhimu, lakini wakati wa kuzungumza juu ya utekelezaji wa mantiki ya biashara katika miradi halisi, kwa kawaida tunapaswa kukabiliana na algorithms ya asili tofauti kabisa, kukumbusha zaidi vielelezo katika vitabu vya watoto juu ya programu. Kitu kama hiki (kilichochukuliwa kutoka):

Kwa hivyo, kwa usawa sihusishi sana ugumu wa asymptotic wa algorithm kama idadi ya juu zaidi ya vizuizi vya msimbo vilivyowekwa ndani ya kila kimoja, au kiwango cha kuweka kiota cha kifungu kirefu zaidi cha msimbo.

Kwa mfano, kipande cha mstari kikamilifu:

Kufanya_a(); kufanya_b(); do_c();
Na sio mstari kabisa:

Kufanya_a(); ikiwa (angalia) ( kitu(); ) kingine ( chochote(); ikiwa ( chochote()) ( kwa (a katika b) ( ikiwa ( nzuri(a)) ( kitu(); ) ) ) )
Ni "vipande" vya aina ya pili ambayo tutajaribu kuandika tena kwa kutumia mbinu fulani.

Kumbuka: kwa kuwa hapa na zaidi tutahitaji mifano ya msimbo ili kuelezea mawazo fulani, tutakubali mara moja kwamba yataandikwa katika lugha ya jumla inayofanana na C, isipokuwa katika hali ambapo sifa za lugha mahususi zilizopo zinahitajika. Kwa visa kama hivyo, itaonyeshwa kwa uwazi katika lugha gani mfano umeandikwa (haswa, kutakuwa na mifano katika Java na Javascript).

4.1. Mbinu 1. Chagua tawi kuu la algorithm.
Katika idadi kubwa ya matukio, inaleta maana kuchukua hali ndefu zaidi ya laini ya algoriti kama tawi kuu.

Wacha tujaribu kufanya hivyo kulingana na "algorithm ya ukarabati wa kiotomatiki" kwenye mchoro hapo juu:

  1. Mteja anawasilisha matakwa yake.
  2. Bwana anachunguza na kusema gharama.
  3. Tafuta kasoro.
  4. Tunaweka order ya vipuri.
  5. Tunachukua malipo ya mapema na kuweka tarehe ya mwisho.
  6. Mteja anaondoka.
Ni tawi hili kuu ambalo tunapaswa kuwa nalo katika kiwango cha sifuri cha kuota.

Sikiliza_mteja(); ikiwa (!is_clean()) ( ... ) check_cost(); ikiwa (!client_agree()) ( ... ) find_defects(); ikiwa (defects_found()) ( ... ) create_request(); chukua_pesa(); kwaheri ();
Kwa kulinganisha, hebu fikiria chaguo ambapo kwa kiwango cha sifuri kuna tawi mbadala, badala ya moja kuu:

Sikiliza_mteja(); ikiwa (!is_clean()) ( ... ) check_cost(); ikiwa (mteja_agree()) ( find_defects(); ikiwa (defects_found()) ( ... ) create_request(); take_money(); ) else ( ... ) bye();
Kama unavyoona, kiwango cha kuweka kiota cha sehemu muhimu ya msimbo kimeongezeka, na kutazama msimbo kwa ujumla kumekuwa sio kupendeza.

4.2. Mbinu 2. Tumia mapumziko, endelea, kurudi au kutupa ili kuondokana na kizuizi mwingine.
Vibaya:

Iwapo (!client_agree()) ( ... ) mwingine ( find_defects(); ikiwa (defects_found()) ( ... ) create_request(); take_money(); bye();)

Iwapo (!client_agree()) ( ... return; ) find_defects(); ikiwa (defects_found()) ( ... ) create_request(); chukua_pesa(); kwaheri ();

Bila shaka, itakuwa ni makosa kuhitimisha kwamba hupaswi kamwe kutumia operator mwingine. Kwanza, muktadha hauturuhusu kila wakati kuweka mapumziko, endelea, kurudi au kutupa(ingawa mara nyingi inaruhusu). Pili, faida kutoka kwa hii inaweza kuwa dhahiri kama katika mfano hapo juu, na rahisi mwingine itaonekana rahisi na wazi zaidi kuliko kitu kingine chochote.

Na tatu, kuna gharama fulani wakati wa kutumia nyingi kurudi katika taratibu na kazi, kwa sababu ambayo wengi kwa ujumla huchukulia mbinu hii kama kipingamizi (maoni yangu ya kibinafsi: kwa kawaida faida bado hufunika gharama hizi).

Kwa hivyo, mbinu hii (na nyingine yoyote) inapaswa kutambuliwa kama kidokezo, na sio kama maagizo ya vitendo bila masharti.

4.3. Mbinu 3. Tunaweka hali ndogo ndogo katika taratibu tofauti.
Kwa sababu Kwa upande wa "algorithm ya ukarabati", tulichagua tawi kuu kwa mafanikio, lakini matawi yetu mbadala yote yalibaki mafupi sana.

Kwa hivyo, tutaonyesha mbinu kulingana na mfano "mbaya" tangu mwanzo wa sura:

Fanya_a() ikiwa (angalia) (kitu(); ) kingine (chochote(); ikiwa (chochote()) ( kwa (a katika b) ( ikiwa (nzuri(a)) ( kitu(); ) ) ) )
Bora zaidi:

Taratibu do_on_whatever() ( kwa (a in b) ( if ( good(a)) ( something(); ) ) ) fanya_a(); ikiwa (angalia) ( kitu(); ) kingine ( chochote(); ikiwa ( chochote()) ( fanya_on_whatever(); ) )
Tafadhali kumbuka kuwa kwa kuchagua jina sahihi kwa utaratibu ulioangaziwa, sisi pia huongeza mara moja hati za kibinafsi za msimbo. Sasa kwa kipande hiki kinapaswa kuwa wazi kwa ujumla kile kinachofanya na kwa nini kinahitajika.

Hata hivyo, inapaswa kukumbushwa katika akili kwamba sawa kujiandikisha itateseka sana ikiwa kipande cha msimbo kilichotolewa hakina kazi iliyokamilishwa kwa ujumla ambayo msimbo hufanya. Ugumu katika kuchagua jina sahihi kwa utaratibu inaweza kuwa kiashiria cha kesi kama hiyo (ona kifungu cha 6.1).

4.4. Mbinu 4. Tunachukua kila kitu kinachowezekana kwenye kitengo cha nje, na kuacha tu kile ambacho ni muhimu katika moja ya ndani.
Vibaya:

Ikiwa (angalia) ( fanya_a(); kitu(); ikiwa ( chochote()) ( kwa (a katika b) ( ikiwa ( kizuri(a)) ( kitu(); ) ) ) kingine ( fanya_a(); chochote ( ); ikiwa (chochote()) ( kwa (a katika b) ( ikiwa ( nzuri(a)) ( kitu(); ) ) ) )
Bora zaidi:

Kufanya_a(); ikiwa (angalia) ( kitu(); ) kingine ( chochote(); ) ikiwa ( chochote()) ( kwa (a katika b) ( ikiwa ( nzuri(a)) ( kitu(); ) ) )

4.5. Mbinu 5 (kesi maalum ya uliopita). Weka ndani jaribu...kamata tu kile kinachohitajika.
Ikumbukwe kwamba vitalu jaribu...kamata kwa ujumla ni chungu linapokuja suala la usomaji wa nambari, kwa sababu Mara nyingi, hupishana, huongeza sana kiwango cha jumla cha kuota hata kwa algorithms rahisi.

Njia bora ya kukabiliana na hii ni kupunguza ukubwa wa eneo ndani ya block. Wale. mistari yote ambayo haitarajii ubaguzi kutokea lazima isogezwe nje ya kizuizi. Ingawa katika hali zingine, kutoka kwa mtazamo wa usomaji, njia iliyo kinyume kabisa inaweza kuwa na faida zaidi: badala ya kuandika vizuizi vingi vidogo. jaribu..kamata, ni bora kuzichanganya katika moja kubwa.

Kwa kuongezea, ikiwa hali hukuruhusu kushughulikia ubaguzi hapa na sasa, lakini kuitupa chini ya safu, kwa kawaida ni bora kufanya hivyo. Lakini lazima tukumbuke kwamba kutofautiana hapa kunawezekana tu ikiwa wewe mwenyewe unaweza kuweka au kubadilisha mkataba wa utaratibu unaohariri.

4.6. Mbinu 6. Kuchanganya ifs nested.
Kila kitu ni dhahiri hapa. Badala ya:

Ikiwa (a) (ikiwa (b) (fanya_kitu();))
Tunaandika:

Ikiwa (a && b) ( do_something(); )

4.7. Mbinu 7. Tumia opereta wa ternary ( a? b:c) badala ya kama.
Badala ya:

Ikiwa (a) ( var1 = b; ) mwingine ( var1 = c; )
Tunaandika:

Var1 = a? b:c;
Wakati mwingine inaeleweka hata kuandika waendeshaji wa ternary waliowekwa, ingawa hii inahitaji msomaji kujua utangulizi ambao misemo ndogo ya waendeshaji wa tatu hutathminiwa.

Ikiwa (a) ( var1 = b; ) vinginevyo ikiwa (aa) ( var1 = c; ) vinginevyo ( var1 = d; )
Tunaandika:

Var1 = a? b:aa? c:d;
Lakini labda haifai kutumia vibaya hii.

Kumbuka kwamba uanzishaji tofauti var1 sasa inafanywa kwa operesheni moja, ambayo inachangia sana kujiandikisha (tazama kifungu cha 6.8).

4.8. Kwa muhtasari wa hapo juu, hebu tujaribu kuandika utekelezaji kamili wa algorithm ya ukarabati kwa mstari iwezekanavyo.
kusikiliza_mteja(); ikiwa (!is_clean()) ( safisha(); ) check_cost(); ikiwa (!mteja_agree()) ( pay_for_wash(); bye(); return; ) find_defects(); ikiwa (defects_found()) ( say_about_defects(); ikiwa (!mteja_akubali()) ( pay_for_wash_and_dyagnosis(); bye(); return; ) ) create_request(); chukua_pesa(); kwaheri ();
Tunaweza kuacha hapa, lakini haionekani kuwa nzuri sana kwamba tunapaswa kupiga simu mara 3 kwaheri() na, ipasavyo, kumbuka kwamba wakati wa kuongeza tawi jipya, italazimika kuandikwa kabla ya kurudi kila wakati (kwa kweli, gharama za kurudi nyingi).

Ingewezekana kutatua tatizo kupitia jaribu...mwishowe, lakini hii si sahihi kabisa, kwa sababu katika kesi hii hakuna mazungumzo juu ya utunzaji wa ubaguzi. Na mbinu kama hiyo inaweza kuzuia sana mchakato wa uwekaji mstari.

Wacha tufanye hivi (kwa kweli, nilitumia kifungu cha 5.1 hata kabla sijaandika):

Taratibu kujadili_na_mteja() ( check_cost(); ikiwa (!mteja_akubali()) ( pay_for_wash(); return; ) find_defects(); ikiwa (kasoro_imepatikana()) ( sema_kuhusu_kasoro(); ikiwa (!mteja_anakubali()) ( lipa_kwa_safisha_na_dyagnosis () ; return; ) ) create_request(); take_money(); ) listen_client(); ikiwa (!is_clean()) ( safisha(); ) negotiate_with_client(); kwaheri ();
Ikiwa unafikiri kwamba sasa tumeandika kitu kidogo, basi, kwa kanuni, ni hivyo. Walakini, ninakuhakikishia kuwa katika miradi mingi ya moja kwa moja utaona utekelezaji tofauti kabisa wa algorithm hii ...

5. Kupunguza kanuni.

Nadhani itakuwa mbaya zaidi kuelezea kuwa kwa kupunguza idadi ya nambari inayotumiwa kutekeleza utendakazi fulani, tunafanya nambari isomeke na kuaminika zaidi.

Kwa maana hii, suluhisho bora la uhandisi ni wakati hakuna kinachofanyika, lakini kila kitu hufanya kazi kama inavyotakiwa. Bila shaka, katika ulimwengu wa kweli, masuluhisho kamili hayapatikani kwa urahisi, ndiyo maana sisi waandaaji programu bado tuna kazi ya kufanya. Lakini ni kweli hii bora ambayo tunapaswa kujitahidi.

5.1. Mbinu 1. Ondoa kurudia msimbo.
Mengi tayari yamesemwa kuhusu kunakili-kubandika na madhara yanayotokana nayo kwamba itakuwa vigumu kuongeza chochote kipya. Walakini, watengenezaji programu, kizazi baada ya kizazi, hutumia njia hii kutekeleza utendakazi wa programu.

Kwa kweli, njia dhahiri zaidi ya kushughulikia shida ni kuhamisha nambari iliyotumiwa tena kwa taratibu na madarasa tofauti.
Katika kesi hiyo, tatizo la kutenganisha jumla kutoka kwa pekee hutokea daima. Mara nyingi hata haieleweki kila wakati ni vipande vipi vya msimbo vinavyofanana zaidi au tofauti. Chaguo hapa hufanywa tu kulingana na hali hiyo. Hata hivyo, kuwepo kwa sehemu zinazofanana za ukubwa wa nusu ya skrini mara moja huonyesha kwamba kanuni hii inaweza na inapaswa kuandikwa kwa muda mfupi zaidi.

Inafaa pia kutaja mbinu muhimu sana ya de-rudufu iliyoelezewa ndani kifungu cha 4.3.
Inaweza kupanuliwa zaidi ya kauli tu. Kwa mfano, badala ya:

Utaratibu proc1() ( init(); do1(); ) utaratibu proc2() ( init(); do2(); ) proc1(); proc2();
tuandike:

Ndani yake(); kufanya1 (); do2();
Au chaguo kinyume. Badala ya:
a = Kitu kipya(); init(a); kufanya (a); b = Kitu kipya(); init(b); kufanya (b);
tuandike:
utaratibu proc(a) ( init(a); fanya(a); ) proc(kitu kipya()); proc(Kitu kipya());

5.2. Mbinu 2. Epuka hali na hundi zisizo za lazima.
Cheki za ziada ni uovu ambao unaweza kupatikana katika karibu programu yoyote. Ni vigumu kueleza jinsi taratibu na algorithms zisizo na maana zaidi zinaweza kuzibwa na ukaguzi usio wa lazima, unaorudiwa na usio na maana.

Hii inatumika haswa, kwa kweli, kwa ukaguzi null. Kama sheria, hii inasababishwa na hofu ya milele ya waandaaji wa programu ya kila mahali NPE na hamu ya kuwa salama tena kutoka kwao.

Aina isiyo ya kawaida ya ukaguzi usio wa lazima ni mfano ufuatao:

Obj = Kitu kipya(); ... ikiwa (obj != null) ( obj.call(); )
Licha ya upuuzi wao wa wazi, ukaguzi kama huo hufanyika kwa ukawaida wa kuvutia. (Nitaweka nafasi mara moja kwamba mfano hautumiki kwa lugha na mazingira hayo adimu ambapo opereta mpya() inaweza kurudi null. Katika hali nyingi (pamoja na Java), hii kimsingi haiwezekani).

Hapa unaweza pia kujumuisha kadhaa ya aina zingine za hundi kwa hali ambayo ni wazi iliyofikiwa (au bila shaka haijafikiwa).
Hapa, kwa mfano, ni kesi ifuatayo:

Obj = factory.getObject(); obj.call1(); // kama obj ingebatilishwa, tungekuwa tayari tumekufa) ikiwa (obj != null) ( obj.call2(); )
Inatokea mara nyingi zaidi kuliko aina ya awali ya hundi.

Mfano wa tatu ni wazi kidogo kuliko mbili za kwanza, lakini ni wazi kila mahali:

Utaratibu wa utaratibu1(obj) ( ikiwa (!is_valid(obj)) rudisha; obj.call1(); ) utaratibu proc2(obj) ( if (!is_valid(obj)) return; obj.call2(); ) obj = kiwanda. getObject(); ikiwa (is_valid(obj) (proc1(obj); proc2(obj);)
Kama unavyoona, mwandishi wa sehemu hii anaogopa kukimbilia kwenye kitu batili, kwa hivyo anakiangalia kabla ya kila kupiga chafya. Ingawa mkakati kama huo wakati mwingine unaweza kuhesabiwa haki (haswa ikiwa proc1() Na proc2() kusafirishwa nje kama API), katika hali nyingi hii ni msimbo tu.

Chaguzi hapa zinaweza kuwa tofauti:

  • Kwa kila utaratibu, fafanua mkataba wa uingizaji unaohitaji mpigaji simu kutimiza masharti fulani ya uhalali. Baada ya hayo, ondoa ukaguzi wa usalama na uhamishe jukumu lote la uhalali wa data ya pembejeo kwa nambari ya simu. Kwa Java, kwa mfano, inaweza kuwa mazoezi mazuri kuashiria njia na sehemu "hatari" kwa kidokezo @Inaweza kubatilishwa. Kwa hivyo, tunaonyesha kwa uwazi kuwa sehemu na mbinu zingine zinaweza kukubali/kurejesha thamani null.
  • Usiunde vitu batili hata kidogo! Mbinu hii inahusisha kutekeleza taratibu zote za uthibitishaji katika hatua ya uundaji wa kitu, ili ukweli halisi wa uundaji uliofanikiwa tayari unahakikisha uhalali. Kwa kweli, hii kwa kiwango cha chini inahitaji kudhibiti darasa la kiwanda au mifumo mingine ya kuunda vitu. Au ili utekelezaji uliopo utupe dhamana kama hiyo.
Pengine, kwa mtazamo wa kwanza, chaguo hizi zinaonekana kuwa haiwezekani au hata kutisha, hata hivyo, kwa kweli, kwa msaada wao unaweza kuongeza kwa kiasi kikubwa usomaji na uaminifu wa kanuni.

Njia nyingine muhimu ni kutumia muundo NullObject, ambayo inajumuisha kutumia kitu na njia ambazo hazifanyi chochote, lakini pia hazisababishi makosa, badala ya "hatari" moja. null. Kesi maalum ya mbinu hii inaweza kuzingatiwa kukataa kutumia null kwa anuwai ya mkusanyiko kwa niaba ya makusanyo tupu.

Hii pia inajumuisha maalum null-salama maktaba, kati ya ambayo ningependa kuangazia seti ya maktaba apache-kawaida kwa Java. Inakuruhusu kuokoa kiasi kikubwa cha nafasi na wakati, kuondoa hitaji la kuandika ukaguzi wa kawaida usio na mwisho. null.

5.3. Mbinu 3. Epuka kuandika "baiskeli". Tunatumia ufumbuzi tayari kwa kiwango cha juu.
Baiskeli ni karibu kama kunakili-bandika: kila mtu anajua ni mbaya, na kila mtu anaziandika mara kwa mara. Tunaweza tu kukushauri angalau kujaribu kupigana na uovu huu.

Mara nyingi tunakabiliwa na kazi au kazi ndogo ambazo tayari zimetatuliwa mara nyingi, iwe ni kupanga au kutafuta kupitia safu, kufanya kazi na miundo ya picha za 2D au seva za muda mrefu za kupigia kura katika Javascript. Kanuni ya jumla ni kwamba matatizo ya kawaida yana suluhisho la kawaida, na suluhisho hili hutuwezesha kupata matokeo tunayotaka kwa kuandika kiwango cha chini cha msimbo wetu.

Wakati mwingine kuna jaribu, badala ya kutafuta kitu, kujaribu na kurekebisha, kwa haraka kuchora baiskeli yako kwenye goti lako. Wakati mwingine hii inaweza kuhesabiwa haki, lakini ikiwa tunazungumza juu ya nambari iliyodumishwa kwa muda mrefu, dakika ya "kuokoa" inaweza kugeuka kuwa masaa ya kurekebisha na kurekebisha makosa kwenye kesi za kona zilizokosa.

Kwa upande mwingine, kugusa tu juu ya mada pana, ningependa kusema kwamba wakati mwingine utekelezaji wa "baiskeli" unaweza au hata unapaswa kupendekezwa kutumia suluhisho lililopangwa tayari. Kawaida hii ni kweli katika kesi ambapo uaminifu katika ubora wa suluhisho lililokamilishwa sio juu kuliko nambari ya asili, au katika kesi wakati gharama za kuanzisha utegemezi mpya wa nje hazikubaliki kiufundi.

Walakini, kurudi kwenye suala la ufupi wa nambari, kwa kweli, kwa kutumia zile za kawaida (kwa mfano, apache-kawaida Na guava kwa Java) na maktaba zisizo za kawaida ni mojawapo ya njia bora zaidi za kupunguza ukubwa wa msimbo wako mwenyewe.

5.4. Mbinu 4. Tunaacha katika msimbo kile ambacho kinatumika tu.
Kazi za "Dangling" ambazo hazijaitwa na mtu yeyote popote; sehemu za kanuni ambazo hazijatekelezwa kamwe; madarasa yote ambayo hayatumiki popote, lakini walisahau kuwaondoa - nina hakika kila mtu angeweza kuona vitu kama hivyo kwenye mradi wao, na labda hata akavichukulia kawaida.

Kwa kweli, kanuni yoyote, ikiwa ni pamoja na zisizotumiwa, inahitaji malipo kwa ajili ya matengenezo yake kwa namna ya tahadhari na wakati uliotumiwa.
Kwa sababu msimbo ambao haujatumiwa hautekelezwi au kujaribiwa, unaweza kuwa na simu zisizo sahihi kwa taratibu fulani, ukaguzi usio wa lazima au usio sahihi, wito kwa taratibu na maktaba za nje ambazo hazihitajiki tena, na aina nyinginezo za kutatanisha au zenye madhara tu.

Kwa hivyo, kwa kuondoa maeneo yasiyo ya lazima na yasiyotumiwa, hatupunguzi tu saizi ya nambari, lakini pia, muhimu sana, tunachangia kujiandikisha.

5.5. Mbinu 5. Tunatumia ujuzi wetu wa lugha na kutegemea msomaji kuwa na ujuzi huu.
Mojawapo ya njia bora za kufanya msimbo wako kuwa rahisi, mfupi na wazi zaidi ni utumiaji wa ustadi wa vipengele vya lugha mahususi: chaguo-msingi mbalimbali, vipaumbele vya uendeshaji, fomu fupi, n.k.

Kama kielelezo, nitatoa zaidi, kutoka kwa maoni yangu, mfano mzuri kwa lugha ya Javascript.

Mara nyingi sana, wakati wa kuchanganua misemo ya kamba, unaweza kuona milundo ifuatayo:
ikiwa (obj != null && obj != undefined && obj.s != null && obj.s != undefined && obj.s != "") ( // fanya jambo)
Inaonekana inatisha, ikiwa ni pamoja na kutoka kwa mtazamo wa "je mwandishi alisahau ukaguzi mwingine." Kwa kweli, kujua upekee wa lugha ya Javascript, katika hali nyingi hundi nzima inaweza kupunguzwa kuwa ndogo:

Ikiwa (obj && obj.s) ( // fanya kitu)
Jambo ni kwamba shukrani kwa utunzi kamili wa boolean, hundi ikiwa (obj) () itapalilia:

  • uongo
  • null
  • isiyofafanuliwa
  • mstari tupu
Kwa ujumla, itaondoa maana nyingi zisizo na maana ambazo tunaweza kufikiria. Kwa bahati mbaya, narudia, watengenezaji wa programu hutumia kipengele hiki mara chache, ndiyo sababu hundi zao za "reinsurance" zinaonekana kuwa mbaya sana.

Vile vile, linganisha fomu za nukuu zifuatazo:

Ikiwa (!a) ( a = Thamani chaguo-msingi; )
Na

A = a || Thamani chaguo-msingi;
Chaguo la pili linaonekana rahisi, kutokana na matumizi ya semantiki maalum ya shughuli za mantiki katika lugha za maandishi.

6. Kanuni ya kujiandikisha.

Neno "kujiandikisha" mara nyingi hutumika kuelezea sifa za miundo kama vile XML au JSON. Katika muktadha huu, ina maana kwamba faili haina tu seti ya data, lakini pia taarifa kuhusu muundo wake, majina ya vyombo na mashamba yaliyotajwa na data hii.

Wakati wa kusoma faili ya XML, hata bila kujua chochote juu ya muktadha, tunaweza karibu kila wakati kupata wazo la kile faili inaelezea, ni aina gani ya data iliyowasilishwa ndani yake, na hata, labda, jinsi itatumika.

Kupanua wazo hili kwa msimbo wa programu, chini ya neno "hati binafsi" ningependa kuchanganya sifa nyingi za msimbo unaokuwezesha kuelewa kwa haraka, bila uchambuzi wa kina na uelewa wa kina wa muktadha.

Ningependa kulinganisha mbinu hii na nyaraka za "nje", ambazo zinaweza kuonyeshwa mbele ya maoni au nyaraka tofauti. Bila kukataa hitaji la zote mbili katika hali fulani, ninagundua kuwa linapokuja suala la usomaji wa nambari, njia za kujiandikisha ni bora zaidi.

6.1. Mbinu 1. Chagua kwa makini majina ya kazi, vigezo na madarasa. Haupaswi kudanganya watu ambao watasoma nambari yetu.
Sheria muhimu zaidi ambayo inapaswa kuchukuliwa kama msingi wakati wa kuandika nambari ya kujiandikisha ni kamwe usidanganye msomaji wako.

Ikiwa uwanja unaitwa jina, jina la kitu linapaswa kuhifadhiwa hapo, na sio tarehe ya kuundwa kwake, nambari ya serial katika safu, au jina la faili ambayo imejumuishwa. Ikiwa njia inaitwa kulinganisha (), inapaswa kulinganisha vitu, na sio kuziweka kwenye jedwali la hashi, ufikiaji ambao unaweza kupatikana mahali pengine mistari 1000 chini ya nambari. Ikiwa darasa linaitwa Kifaa cha Mtandao, basi mbinu zake za umma zinapaswa kuwa na shughuli zinazotumika kwa kifaa, na si utekelezaji wa jumla wa upangaji haraka.

Ni ngumu kuelezea kwa maneno mara ngapi, licha ya uwazi wa sheria hii, waandaaji wa programu huivunja. Sidhani kama inafaa kuelezea jinsi hii inavyoathiri usomaji wa nambari zao.

Ili kuepuka matatizo hayo, ni muhimu kufikiri kupitia jina la kila kutofautiana, kila njia na darasa kwa makini iwezekanavyo. Wakati huo huo, ni lazima tujaribu si kwa usahihi tu, lakini pia, ikiwa inawezekana, iwezekanavyo. kamili kuelezea madhumuni ya kila muundo.

Ikiwa hii haiwezi kufanywa, sababu kawaida ni makosa madogo au ya jumla ya muundo, kwa hivyo hii inapaswa kuchukuliwa angalau kama kengele ya kengele.

Ni wazi, inafaa pia kupunguza utumiaji wa anuwai zilizotajwa i, j, k, s. Vigezo vilivyo na majina kama haya vinaweza tu kuwa vya ndani na kuwa na semantiki zinazokubalika kwa jumla pekee. Lini i, j, hizi zinaweza kuwa kaunta za kitanzi au faharasa katika safu. Ingawa, ikiwezekana, inafaa kujiondoa kaunta kama hizo kwa niaba ya vitanzi vya mbele na misemo ya kazi.
Vigezo vyenye majina ii, i1, ijk42, asdsa nk. isitumike kamwe. Naam, labda ikiwa unafanya kazi na algorithms ya hisabati ... Hapana, ni bora kamwe.

6.2. Mbinu 2. Tunajaribu kuita vitu vinavyofanana sawa, na tofauti tofauti.
Mojawapo ya matatizo ya kukatisha tamaa ambayo hutokea wakati wa kusoma msimbo ni visawe na homonimu zinazotumiwa ndani yake. Wakati mwingine katika hali ambapo vyombo viwili tofauti vinaitwa sawa, unapaswa kutumia saa kadhaa kutenganisha matukio yote ya matumizi yao na kuelewa ni vyombo gani vinavyomaanisha katika kila kesi maalum. Bila utengano huo, uchambuzi wa kawaida, na kwa hiyo urekebishaji wa maana wa kanuni, haiwezekani kwa kanuni. Na hali kama hizi hutokea mara nyingi zaidi kuliko mtu anavyoweza kutarajia.

Takriban sawa kunaweza kusemwa kuhusu tatizo la "reverse" - wakati majina kadhaa tofauti yanatumiwa kwa huluki/operesheni/algorithm sawa. Muda wa kuchanganua msimbo kama huo unaweza kuongezeka kwa kiasi kikubwa ikilinganishwa na inavyotarajiwa.

Hitimisho ni rahisi: katika programu zako unapaswa kutibu kuibuka kwa visawe na homonimu kwa uangalifu sana na ujaribu uwezavyo kuzuia hili.

6.3. Mbinu 3. "Wembe wa Occam". Hatuundi huluki ambazo tunaweza kufanya bila.
Kama ilivyotajwa tayari katika aya ya 5.4., kipande chochote cha msimbo, kitu chochote, chaguo la kukokotoa au kigezo chochote ambacho utaunda, katika siku zijazo, wakati wa mchakato wa usaidizi, kitahitaji malipo katika mfumo wa wakati na umakini wako (au wa mtu mwingine).

Hitimisho la moja kwa moja linafuata kutoka kwa hili: huluki chache unazoingiza, msimbo wako utakuwa rahisi na bora zaidi.

Mfano wa kawaida wa kutofautisha "ziada":

Int sum = counSum(); int iliongezekaJumla = jumla + 1; fanya kazi (iliyoongezekaSm); ...
Ni wazi kutofautiana iliongezeka Jumla ni chombo cha ziada, kwa sababu maelezo ya kitu ambacho huhifadhi (jumla + 1) huangazia kitu fulani bora zaidi na kwa usahihi zaidi kuliko jina la kigezo. Kwa hivyo, nambari inapaswa kuandikwa tena kama ifuatavyo ("inline" kutofautisha):

Int sum = counSum(); fanya kazi (jumla + 1); ...
Ikiwa kiasi hicho hakitumiki popote zaidi katika msimbo, unaweza kwenda mbali zaidi:

Fanya kazi(countSum() + 1); ...
Kuweka viambatisho visivyo vya lazima ni njia mojawapo ya kufanya msimbo wako kuwa mfupi, rahisi na wazi zaidi.

Hata hivyo, inapaswa kutumika tu ikiwa mbinu hii inakuza kujiandikisha na haipingani nayo. Kwa mfano:

Descr mara mbili = b * b - 4 * a *c; mara mbili x1 = -b + sqrt(descr) / (2 * a);
Katika kesi hii, kutofautiana kwa inline descr hakuna uwezekano wa kufaidika usomaji, kwa sababu kigezo hiki kinatumika kuwakilisha huluki mahususi kutoka eneo la somo, na, kwa hiyo, kuwepo kwa kigezo huchangia kujiandikisha kwa kanuni, na kigezo chenyewe hakiingii chini ya wembe wa Occam.

Kwa muhtasari wa kanuni iliyoonyeshwa katika mfano huu, tunaweza kuhitimisha yafuatayo: inashauriwa kuunda vigeu/vitendo/vitu katika programu yako ikiwa tu vina vielelezo katika eneo la somo. Wakati huo huo, kwa mujibu wa kifungu cha 6.1, lazima tujaribu kuhakikisha kwamba jina la vitu hivi linaonyesha mawasiliano haya kwa uwazi iwezekanavyo. Ikiwa hakuna mawasiliano kama hayo, inawezekana kabisa kwamba kutumia kibadilishaji/kazi/kitu kunapakia msimbo wako tu, na kuwaondoa kutafaidi programu tu.

Kanuni ya jumla ni rahisi: algorithms yoyote iliyoandikwa kwa uwazi au masharti tayari yanajiandikisha, kwa kuwa madhumuni yao na kanuni ya uendeshaji tayari imeelezewa na wao wenyewe. Kinyume chake, hali yoyote isiyo ya moja kwa moja na uendeshaji na madhara hufanya iwe vigumu sana kuelewa kiini cha kile kinachotokea.

Unaweza kutoa mfano mbaya, ukimaanisha kuwa maisha hutupa mifano kama hii mara nyingi.

Hali isiyo ya moja kwa moja:

Ikiwa (i == abs(i)) ( )
Hali ya moja kwa moja:

Ikiwa (i>= 0) ( )
Nadhani si vigumu kutathmini tofauti katika usomaji.

6.5. Mbinu 5. Kila kitu kinachoweza kufichwa kwa faragha (kilindwa) kinapaswa kufichwa hapo. Encapsulation ni kila kitu kwetu.
Ninaona kuwa sio lazima kuzungumza juu ya faida na hitaji la kufuata kanuni ya ujumuishaji wakati wa kuandika programu katika nakala hii.
Ningependa tu kusisitiza jukumu la encapsulation kama utaratibu wa kujiandikisha nambari. Awali ya yote, encapsulation inakuwezesha kuonyesha wazi interface ya nje ya darasa na kuteua "pointi zake za kuingia," yaani, mbinu ambazo utekelezaji wa kanuni zilizomo katika darasa zinaweza kuanza. Hii huruhusu mtu anayesoma msimbo wako kuokoa muda mwingi kwa kuzingatia utendakazi wa darasa na kujitenga na maelezo ya utekelezaji.
6.6. Mbinu 6. (Ujumla wa uliopita) Tunatangaza vitu vyote katika upeo mdogo iwezekanavyo.
Kanuni ya kuweka kikomo kwa upeo wa kila kitu inaweza kupanuliwa zaidi kuliko usimbaji wa kawaida wa OOP.

Mfano rahisi:

Object someobj = createSomeObj(); ikiwa (some_check()) ( // Siitaji someobj hapa ) kwingine ( someobj.call(); )
Ni wazi, tamko kama hilo la utofauti wa someobj hufanya iwe ngumu kuelewa madhumuni yake, kwani msomaji wa nambari yako atatafuta simu kwake katika eneo pana zaidi kuliko inavyotumika na inahitajika.

Sio ngumu kujua jinsi ya kufanya nambari hii kuwa bora zaidi:

Ikiwa (some_check()) ( // Siitaji someobj hapa ) kwingine ( Object someobj = createSomeObj(); someobj.call(); )

Naam, au, ikiwa kutofautiana kunahitajika kwa simu moja, unaweza pia kutumia kifungu cha 6.3:

Ikiwa (some_check()) ( // Siitaji someobj hapa ) kwingine ( createSomeObj().call(); )
Kwa kando, ningependa kutaja kesi wakati mbinu hii inaweza kufanya kazi au kufanya kazi kwa madhara yake. Hivi ni vigeu ambavyo huanzishwa nje ya vitanzi. Kwa mfano:

Object someobj = createSomeObj(); kwa (int i = 0; i< 10; i++) { someobj.call(); }
Ikiwa unaunda kitu kupitia createSomeObj()- operesheni ya gharama kubwa, kuiingiza kwenye kitanzi inaweza kuwa na athari mbaya kwenye utendaji wa programu, hata ikiwa inaboresha usomaji.

Kesi kama hizo hazibatilishi kanuni ya jumla, lakini hutumika tu kuonyesha kwamba kila mbinu ina eneo lake la matumizi na inapaswa kutumiwa kwa kufikiria.

6.7. Mbinu 7. Tunatenganisha kwa uwazi muktadha tuli na unaobadilika. Njia ambazo hazitegemei hali ya kitu lazima ziwe tuli.
Kuchanganyikiwa au ukosefu wa utengano kati ya miktadha tuli na inayobadilika sio mbaya zaidi, lakini uovu wa kawaida sana.

Inasababisha kuonekana kwa utegemezi usiohitajika juu ya hali ya kitu kwa njia zinazowezekana za tuli, au kwa ujumla kwa usimamizi usio sahihi wa hali ya kitu. Matokeo yake, inakuwa vigumu kuchambua kanuni.

Kwa hiyo, ni muhimu kujaribu kulipa kipaumbele kwa kipengele hiki, kuonyesha wazi njia ambazo hazitegemei hali ya kitu.

6.8. Mbinu 8. Tunajaribu kutotenganisha tamko na uanzishaji wa kitu.
Mbinu hii hukuruhusu kuchanganya tamko la jina la kitu na maelezo ya haraka ya kitu hicho ni nini. Huu ni mfano wazi wa kufuata kanuni ya kujiandikisha.

Ikiwa mbinu hii itapuuzwa, msomaji atalazimika kutafuta kila kitu kwenye msimbo, ambapo ilitangazwa, ikiwa imeanzishwa mahali fulani na thamani tofauti, nk. Yote hii inafanya kuwa vigumu kuchambua msimbo na huongeza muda unaohitajika kuelewa kanuni.

Ndiyo sababu, kwa mfano, shughuli za kazi kutoka apache CollectionUtils Na Makusanyo ya guava2 mara nyingi hupendekezwa kwa kujengwa kwa Java kwa kila loops - hukuruhusu kuchanganya tamko na uanzishaji wa mkusanyiko.

Hebu tulinganishe:

lowercaseStrings = ArrayList mpya (); /* mkusanyiko haujaanzishwa hapa, unahitaji kuchunguza uanzishaji */ kwa (Kamba s: baadhi ya masharti) ( lowercaseStrings.add(StringUtils.lowerCase(s)); )
c:
// kupata mkusanyiko wa "somestrings" kwa namna fulani ... Mkusanyiko lowercaseStrings = Collections2.transform(somestrings, new Function () ( @Override public Kamba inatumika(String s) ( return StringUtils.lowerCase(s); ) )));
Ikiwa tunatumia Java 8, tunaweza kuiandika kwa ufupi kidogo:

Mkusanyiko lowercaseStrings = somestrings.stream() .map(StringUtils::lowerCase).kusanya(Collectors.toList());
Kweli, inafaa kutaja kesi hiyo wakati kwa njia fulani unapaswa kutenganisha tamko na uanzishaji wa vigezo. Hii ni kesi ya kutumia variable katika vitalu hatimaye Na kukamata(kwa mfano, kutoa rasilimali fulani). Hakuna cha kufanya hapa isipokuwa kutangaza kutofautisha hapo awali jaribu, na uanzishe ndani ya kizuizi jaribu.

6.9. Mbinu ya 9. Tunatumia mbinu ya kutangaza na zana za utendakazi za programu ili kuonyesha, badala ya kuficha, kiini cha kile kinachotokea.
Kanuni hii inaweza kuonyeshwa kwa mfano kutoka kwa aya iliyotangulia, ambayo tulitumia uigaji wa mbinu ya utendaji katika Java ili kufanya msimbo wetu uwe wazi zaidi.

Kwa uwazi zaidi, hebu tuzingatie mfano katika Javascript (iliyochukuliwa kutoka hapa: http://habrahabr.ru/post/154105).

Hebu tulinganishe:

Var str = "iliyotajwa na"; kwa(var i =0; l= tweeps.length; i< l; ++i){ str += tweeps[i].name; if(i< tweeps.length-1) {str += ", "} }
c:

Var str = "imetajwa na " + tweeps.map(function(t)( return t.name; )).jiunge(", ");
Naam, mifano ya kutumia mbinu ya kazi ambayo inaua usomaji ... Hebu tuhifadhi mishipa yetu wakati huu na tufanye bila yao.

6.10. Mbinu 10. Tunaandika maoni tu ikiwa bila yao haijulikani kabisa kinachotokea.
Kama ilivyoelezwa hapo juu, kanuni ya kujiandikisha binafsi ni kinyume na kuweka kumbukumbu kwa kutumia maoni. Ningependa kueleza kwa ufupi kwa nini maoni ni mabaya sana:
  • Nambari iliyoandikwa vizuri haihitaji.
  • Ikiwa kudumisha kanuni mara nyingi huwa kazi kubwa, kwa kawaida hakuna mtu anayehusika katika kudumisha maoni, na baada ya muda maoni hupitwa na wakati na kuanza kudanganya watu ("maoni yana uongo").
  • Wanatupa nafasi, na hivyo kuzidisha mwonekano wa nambari na kuifanya iwe ngumu kusoma.
  • Katika idadi kubwa ya kesi, zimeandikwa kibinafsi na Kapteni Obvious.
Naam, maoni yanahitajika katika hali ambapo haiwezekani kuandika msimbo mzuri kwa sababu moja au nyingine. Wale. Yanapaswa kuandikwa kuelezea sehemu za kanuni ambazo zingekuwa ngumu kusoma bila wao. Kwa bahati mbaya, hii hufanyika mara kwa mara katika maisha halisi, ingawa inapaswa kuzingatiwa tu kama maelewano yasiyoepukika.

Pia, kama aina ya maelewano kama haya, mtu anapaswa kuzingatia hitaji la kutaja mkataba wa mbinu/tabaka/utaratibu kwa kutumia maoni ikiwa hauwezi kuelezewa kwa njia ya lugha nyingine (tazama kifungu cha 5.2).

7. Hitimisho la kifalsafa.

Baada ya kumaliza kuwasilisha mbinu na mbinu za kimsingi ambazo unaweza kufanya msimbo wako kuwa mzuri zaidi, unapaswa kuunda tena kwa uwazi: hakuna mbinu yoyote ambayo ni mwongozo usio na masharti wa hatua. Mbinu yoyote ni njia tu inayowezekana ya kufikia lengo fulani.

Kwa upande wetu, lengo ni kufanya kanuni isomeke na iweze kudhibitiwa iwezekanavyo. Ambayo wakati huo huo itakuwa ya kupendeza kutoka kwa mtazamo wa uzuri.

Kusoma mifano iliyotolewa katika kifungu cha sasa, mtu anaweza kugundua kwa urahisi kuwa kanuni zote za asili zenyewe (ufupi, udogo, kujiandikisha) na mbinu maalum hazijitegemea. Kwa kutumia mbinu moja, tunaweza pia kufuata moja kwa moja tofauti kabisa. Kwa kuboresha moja ya viashirio lengwa, tunaweza kuchangia katika uboreshaji wa wengine.

Hata hivyo, jambo hili pia lina upande wa chini: mara nyingi kuna hali wakati kanuni zinapingana moja kwa moja na kila mmoja, pamoja na sheria nyingine nyingi zinazowezekana na mafundisho ya programu (kwa mfano, na kanuni za OOP). Unahitaji kuchukua hii kwa utulivu kabisa.
Pia kuna matukio wakati hakuna suluhu zuri kwa tatizo fulani, au suluhisho hili haliwezekani kwa sababu kadhaa (kwa mfano, mteja hataki kukubali mabadiliko yanayoweza kuwa hatari katika kanuni, hata kama yanachangia uboreshaji wa jumla wa ubora).

Katika upangaji programu, kama ilivyo katika maeneo mengine mengi ya shughuli za binadamu, hakuwezi kuwa na maagizo ya jumla ya utekelezaji. Kila hali inahitaji kuzingatia na uchambuzi tofauti, na uamuzi lazima ufanywe kwa kuzingatia ufahamu wa hali maalum ya hali hiyo.

Kwa ujumla, ukweli huu haupuuzi kwa njia yoyote manufaa ya kubainisha na kuelewa kanuni za jumla na kusimamia mbinu mahususi za kuzitekeleza. Ndio sababu ninatumahi kuwa kila kitu kilichoonyeshwa kwenye kifungu kinaweza kuwa muhimu sana kwa watengeneza programu wengi.

Naam, maneno machache zaidi kuhusu tulipoanzia - kuhusu uzuri wa msimbo wetu. Hata kama unajua kuhusu mbinu "za hali ya juu" za kuandika msimbo mzuri, hupaswi kupuuza mambo rahisi zaidi, kama vile uumbizaji wa kiotomatiki na kufuata mtindo wa usimbaji ulioanzishwa katika mradi. Mara nyingi uumbizaji pekee unaweza kufanya maajabu kwa kipande kibaya cha msimbo. Pamoja na upangaji wa akili wa sehemu za nambari kwa kutumia mistari tupu na mapumziko. Ongeza vitambulisho

Kujua jinsi ya kuandika msimbo haimaanishi kuwa na uwezo wa kuifanya kwa usahihi. Msimbo mzuri ni kama chapisho lililoundwa kwa uzuri - ni rahisi kusoma, rahisi kusogeza, na msanidi daima anaelewa jinsi ya kuipanua, kuisuluhisha, au kuitumia kwa madhumuni mengine.
Kwa hiyo, daima ni muhimu kuzingatia muundo wa kanuni na kutoa maoni juu ya sehemu ngumu za kanuni.

Kwanza, nadharia kidogo. Nambari sawa inaweza kuandikwa kwa njia tofauti. Kanuni inaweza kuwa kiutaratibu, kazi Na yenye mwelekeo wa kitu.

Mbinu ya kiutaratibu

Njia ya utaratibu ni rahisi zaidi. Inamaanisha hati ambayo amri zimeandikwa na kazi za msingi za PHP zinaitwa.
Kwa mfano:

$a = 10;
$c = $a% $b;
$e + $d;
echo pande zote($e);
?>

Njia hii inafaa ikiwa una nambari ndogo sana au inafanya kazi moja madhubuti (kwa mfano, kutengeneza picha), kama wanasema, "hatua kwenda kulia, au kushoto."

Mbinu ya kiutendaji

Katika mbinu ya kufanya kazi, nambari yako imegawanywa katika sehemu na kila sehemu imewekwa katika kazi yake mwenyewe. Hii itaepuka kurudia msimbo, fanya msimbo kuwa mfupi na rahisi kusoma.
Pia, kila kitendakazi kitakuwa na wigo wake wa kutofautisha. Hiyo ni, vigeu "vinavyoishi ndani yake" havitawahi kuvuja nje na viambajengo vinavyotumika nje ya chaguo za kukokotoa pia havitaishia kwenye kitendakazi chenyewe.
Kwa kufafanua kazi, wewe mwenyewe unaweza kutaja ni vigezo gani vinapaswa kuingia kwenye kazi na nini inapaswa kurudi, yaani, unadhibiti madhubuti mchakato huu.

Sasa hebu tujaribu kazi.

//itarudisha gharama
fanya kazi getPrice($price, $weight) (
$matokeo_bei * $uzito;
kurudi $matokeo_bei;
}
// rudisha uzito wote
fanya kazi getWeights() (
safu ya kurudi (5, 12, 14, 16, 22, 135, 150, 200, 254, 300, 400);
}

// pata uzani katika kutofautisha
$ uzito matunda yote
foreach ($fruits as $fruit) (
foreach ($weights as $weight) (
echo $fruit["name"] . "". $uzito. "gharama ya kilo". getPrice($fruit["price"], $weight) . "sugua.
";
}
}
?>

Nambari hiyo ilitoka zaidi kusomeka. Uzito umebainishwa katika kipengele cha kukokotoa kupataWeights Na kwa kuongeza rahisi zihesabu hapo, uzito tofauti wa kila tunda ungegharimu kiasi gani.
Nilipitia matunda yote na kwa kila utafutaji nilipitia uzito wote. Inaweza kuwa imefanywa kwa njia nyingine kote.
Chanzo kwenye pastebin http://pastebin.com/07QTBihX

Na hatimaye utekelezaji juu OOP.

darasa la matunda (
matunda $ ya umma;
uzani wa $ za umma;

kazi ya umma setData($fruits, $weights) (
$this->fruits = $fruits;
$this->uzito = $uzito;
}

kazi ya kibinafsi getPrice($price, $weight) (
$result_price = $bei * $uzito;
kurudi $matokeo_bei;
}

kazi ya umma getResult() (
// panga kupitia matunda yote
foreach ($this->fruits as $fruit) (
// iterate kupitia uzani wote kwa kila tunda
foreach ($this->weights as $weight) (
echo $fruit["name"] . "". $uzito. "gharama ya kilo". self::getPrice($fruit["price"], $weight) . "sugua.
";
}
}
}
}

$fruiting = Matunda mapya();
$fruiting->setData($fruits, array(5, 12, 14, 16, 22, 135, 150, 200, 254, 300, 400));
$fruiting->getResult();
?>

Kama unaweza kuona, nambari ni kubwa zaidi. Kwa mahesabu rahisi, unaweza kupata njia ya kufanya kazi, lakini miradi yote mikubwa na ngumu imeandikwa kwa kutumia OOP.

Wakati wa kuandika nyenzo, nilijaribu kufuata ushauri wa @ontofractal :)

P.S. Unapoandika msimbo, fikiria kuwa utadumishwa na mwendawazimu asiye na utulivu kiakili ambaye anajua unapoishi.

Siku njema kwa wote wanaosoma sasa uchapishaji huu. Leo nataka kukuambia kuhusu moja ya zana za ujenzi wa tovuti ambazo hakuna rasilimali ya mtandao inaweza kufanya bila. Hii ni menyu ya tovuti, au kama wanavyosema pia ramani ya tovuti. Leo kuna idadi isiyo na kikomo ya aina na aina ndogo za menyu.

Watengenezaji wa maduka ya mtandaoni, blogu, huduma za elimu na rasilimali nyingine wanajaribu na kuunda ramani mpya zaidi na zisizo za kawaida. Baada ya kusoma kifungu hicho, utajifunza ni vikundi gani kuu vya aina zote za paneli za urambazaji zimegawanywa, utaweza kujaribu kila mmoja wao, na pia ujifunze jinsi ya kuandika msimbo wa menyu kwa wavuti ya html. Sasa hebu tushuke kwenye biashara!

Zana za kuunda upau wa kusogeza

Kuna njia kadhaa za kuunda menyu katika lugha ya alama. Wazo lao la msingi ni kutumia orodha isiyo na nambari. Kwa hivyo, katika html 4, ambayo inajulikana kwetu, watengenezaji huandika vitambulisho kwenye ukurasa

    Na
  • .

    Kama ilivyoelezwa katika machapisho yaliyopita, kipengele cha jozi

      huunda orodha yenye vitone na
    • - kipengele kimoja cha orodha. Kwa uwazi, wacha tuandike nambari ya menyu rahisi:

      Urambazaji

      Urambazaji wa tovuti

      • nyumbani
      • Habari za wiki
      • Maendeleo ya kiteknolojia
      • Soga


      Walakini, pamoja na ujio wa jukwaa, lugha ya alama ilijazwa tena na vitambulisho vya ziada. Ndiyo maana orodha ya tovuti za kisasa zinaundwa kwa kutumia maalum tagi< menyu>. Katika matumizi, kipengele hiki si tofauti na orodha zilizo na vitone.

      Badala ya moja < ul> imeagizwa < menyu>. Hata hivyo, tofauti kubwa huonekana wakati kuhukumiwa kutoka upande wa kazi. Kwa hiyo, mfano wa pili unaharakisha kazi programu za utafutaji na roboti katika. Wakati wa kuchambua muundo wa tovuti, wanaelewa mara moja kwamba kipande hiki cha kanuni kinawajibika kwa ramani ya tovuti.

      Kuna menyu za mlalo, wima na kunjuzi. Wakati mwingine upau wa kusogeza umeundwa kama picha. Kwa kuwa sehemu ya teknolojia imeongezeka, huduma za mtandao zinafanywa kukabiliana, i.e. Muundo wa ukurasa hubadilika kiotomatiki kwa saizi ya skrini ya kifaa. Wacha tuangalie vikundi vya menyu vilivyoorodheshwa.

      Hebu tuunde kielelezo cha urambazaji cha mlalo

      Aina hii ya urambazaji ndiyo inayojulikana zaidi. Wakati kidirisha kimeundwa kwa mlalo, vipengee vyote vya menyu viko kwenye kijajuu cha ukurasa au katika "chini" (wakati mwingine vipengele vya kusogeza vinarudiwa, vikionekana kwa wakati mmoja juu na chini).

      Kwa mfano, tutaunda paneli ya usawa, vitu vya menyu ambavyo vitaundwa kwa kutumia CSS (karatasi za mtindo wa kuteleza), au tuseme kubadilishwa. Ndiyo, kila mtu kipengele tofauti itakuwa iko katika mstatili uliopigwa. Umevutiwa?

      Kwa mabadiliko tunatumia mali ya css inayoitwa kubadilisha. Ili kutaja mabadiliko, tumia kazi iliyojengwa skewX, ambayo angle ya mwelekeo inaonyeshwa kwa digrii.

      Kwa bahati mbaya, kila kivinjari hufanya kazi na mali hii kwa njia yake mwenyewe, licha ya viwango vilivyowekwa. Kwa hivyo, viambishi awali maalum viliundwa kuashiria hii:

      • -ms- (Internet Explorer)
      • -o- (Opera)
      • -webkit- (Chrome, Safari)
      • -moz- (Firefox)

      Sasa hebu tutumie ujuzi uliopatikana kwa kuandika mfano.

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <a href="https://redcomrade.ru/sw/case/sistemnyi-blok-svoimi-rukami-oformlyaem-perednyuyu-panel-korpusa-svoimi-rukami/">Paneli ya usawa</a>
    • nyumbani
    • Kuhusu kampuni
    • Bidhaa
    • Anwani


    • Paneli ya usawa

    • nyumbani
    • Kuhusu kampuni
    • Bidhaa
    • Anwani


    • Na sasa kwa wima. Nilisema wima!

      Kwa programu ya pili tunatumia nambari iliyopita kama msingi. Nilitaka vitu vyangu vya menyu wima viwe na pembe za mviringo badala ya zile zilizopinda.

      Kwa hili nilitumia nyingine mali ya css mpaka-radius.

      Katika makala zilizopita tayari nimefanya kazi na parameter hii, kwa hiyo sidhani kama kutakuwa na matatizo yoyote katika kuelewa utendaji wake.

      Paneli ya wima

    • nyumbani
    • Kuhusu kampuni
    • Bidhaa
    • Anwani


    • Kama ulivyoona tayari, badiliko kuu katika msimbo huu ni kutokuwepo kwa tamko kuonyesha: inline-block, ambayo kwa hakika iliwajibika kwa mpangilio mlalo wa sehemu za urambazaji.

      Vipengee vidogo kwenye menyu: orodha kunjuzi

      Tumeangalia makundi makuu baa za urambazaji, hata hivyo, kuna aina kadhaa zaidi, au bora zaidi, nyongeza.

      Nyakati nyingine hali hutokea wakati baadhi ya mambo yanatimiza yale makuu. Katika kesi hii, huwezi kufanya bila orodha za kushuka. Zinaundwa kupitia mabadiliko kwa kutumia zana za css.

      Hapo chini nimeambatisha nambari ya programu ndogo inayotekelezea mbinu hii.

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 Orodha kunjuzi

      Orodha kunjuzi



      KATIKA katika mfano huu Niligawanya vitengo vya menyu katika madarasa mawili:

      1. m-menyu
      2. s-menyu

      Darasa la kwanza linawajibika kwa menyu kuu, na menyu ya s inawajibika kwa menyu ndogo.

      Katika kanuni unaweza kupata mbinu kama vile .m-menu > li:hover au .m-menyu > li.

      Kwa hivyo, kwa kutumia:hover, unabainisha jinsi kipengee kitafanya kazi unapoelea juu yake.

      Katika kesi hii, ishara ">" hurekebisha kiteuzi ili vitu vya kiwango cha juu tu ni herufi ndogo ndogo.

      Hapo awali, menyu ndogo iliwekwa onyesha:hakuna, ambayo hujulisha kidhibiti kuficha kitu hiki. Baada ya kuelea juu ya kipengele cha kusogeza kinachoonyesha elea, thamani ya mali kuonyesha mabadiliko kwa kuzuia na hivyo orodha kunjuzi inafungua.

      Kama unaweza kuona, utekelezaji wa mbinu hii ni rahisi sana.

      Sasa umefahamu aina kuu za paneli za urambazaji na unaweza kuzirekebisha, kuziongeza na kuzifanya za kisasa wewe mwenyewe. Ikiwa ulipenda nakala yangu, kisha ujiandikishe kwa sasisho za blogi na ushiriki chanzo cha maarifa na marafiki na wenzako. Kwaheri!

      Salamu nzuri, Roman Chueshov

      Soma: Mara 1010