10. Ymarferion Codio Da - Y Triongl Ymaferion Da
⏪ Blaenorol | Nesaf ⏩ |
Mae’r tri agwedd ymarferion codio da, Dogfennaeth, Modiwlareiddio, a Phrofion Awtomatig, yn gweithio’n gwell gyda’i gilydd. Nid yw’n gwneud synnwyr gofyn pa un fydd orau i’w wneud.
Mae’r ddelwedd isod yn dangos y perthynas rhwng y tri pheth:
- Dogfennaeth & Modiwlaredd: Mae cod darllenadwy yn helpu adnabod lle allwn torri lan y cod. Ac mae cydrannau bach yn cynyddu cywirdeb y ddogfennaeth. Mae enwau ffwythiannau yn bwysig iawn: os na allwn feddwl am enw ystyrlon cryno ar gyfer beth mae ffwythiant yn gwneud, fel arfer arwydd yw hwn gallwn dorri’r ffwythiant lan ymhellach.
- Dogfennaeth & Profion: Mae dogfennaeth a phrofion yn helpu egluro pwrpas cod. Mae dogfennaeth felly yn egluro pwrpas y profion, ac mae profion felly yn cadarnhau beth ddywedir yn y ddogfennaeth. Os nad yw’r rhain yn cytuno, nid yn unig yw’r cod yn anodd ei ddarllen a deall, ond ni all y cod cyflawni beth y ddisgwylir.
- Modiwlaredd & Profion: Mae torri lan y cod yn gwneud hi’n bosibl i brofi’r cod, gan fod angen ffwythiannau, gwrthrychau a modiwlau i fedru rhedeg profion. Mae profion yn sicrhau bod y cydrannau yma yn gweithio fel y disgwylir, ar wahân a gyda’i gilydd. Hefyd mae profi darnau bach o god yn cynyddu ystyr y negeseuon gwallau, trwy adnabod yn union ble yn y cod mae gwall, a beth yn union sydd o’i le.
Fel adolygiad o’r adran yma, ystyriwn enghraifft o godio Algorithm Euclid ar gyfer canfod ffactor cyffredin mwyaf dau rif.
Mae’r cais cyntaf y gweithredu’r algorithm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = 1071
b = 462
C = []
while a != 0 and b != 0: i=0
while a >= b:
a -= b
i += 1
a, b = b, a
C.append(i)
C.append(a)
C.append(b)
print(max(C))
Serch hynny, mae’n anodd iawn i’w ddarllen os nad ydyn yn gwybod Algorithm Euclid (N.B. does dim angen gwybod Algorithm Euclid; dylai cod da bod yn hunan esboniadol).
Ychwanegwn ddogfennaeth:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mwyaf = 1071
lleiaf = 462
ffactorau = []
# Algorithm Euclid
while mwyaf != 0 and lleiaf != 0:
lluosrif = 0
while mwyaf >= lleiaf:
mwyaf -= lleiaf
lluosrif += 1
mwyaf, lleiaf = lleiaf, mwyaf # cyfnewid enwau'r newidynnau
ffactorau.append(lluosrif)
ffactorau.append(mwyaf)
ffactorau.append(lleiaf)
print(max(ffactorau))
Mae hwn bach mwy darllenadwy, ond mae’n edrych fel bloc mawr o god.
Torrwn ni’r cod i fyny. Mae lŵp o fewn lŵp, felly mae’n gwneud synnwyr tynnu un lŵp mas fel ffwythiant:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def tynnu_lluosrifau(mwyaf, lleiaf):
"""
Faint o weithiau mae un rhif yn mynd mewn i rhif arall
"""
lluosrif = 0
while mwyaf >= lleiaf:
mwyaf -= lleiaf
lluosrif += 1
return mwyaf, lleiaf, lluosrif
def ffactor_cyffredin_mwyaf(mwyaf, lleiaf):
"""
Algorithm Euclid y canfod ffactor mwyaf cyffredin dau rhif
"""
ffactorau = []
while mwyaf != 0 and lleiaf != 0:
lleiaf, mwyaf, lluosrif = tynnu_lluosrifau(mwyaf, lleiaf)
ffactorau.append(lluosrif)
ffactorau.append(mwyaf)
ffactorau.append(lleiaf)
return max(ffactorau)
print(ffactor_cyffredin_mwyaf(1071, 462))
Nid yw enw’r ffwythiant cyntaf, tynnu_lluosrifau
yn gwneud lot o synnwyr.
Mae’n anodd iawn disgrifio beth sy’n mynd ymlaen fan hyn, felly efallai mai modd
torri’r cod lawr rhagor.
- Beth mae’r cod yn ei wneud?
- Rhoi faint o weithiau mae
lleiaf
yn mynd mewn imwyaf
, - Rhoi
lleiaf
nol, - Rhoi gweddill ar ôl tynnu
lleiaf
omwyaf
gymaint o weithiau a gallwn.
- Rhoi faint o weithiau mae
Mae hwn wedi uwcholeuo ffordd o wella’r ffwythiant hynny (mewn gwirionedd does
dim angen ffwythiant arall ar gyfer y gweithrediad yma, mae datganiad %
Python
yn gwneud y job. Cofiwch y rheol ‘paid ailddyfeisio’r olwyn’, os oes cod sy’n
gwneud y job yn barod, defnyddia hi!):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def ffactor_cyffredin_mwyaf(mwyaf, lleiaf):
"""
Algorithm Euclid y canfod ffactor mwyaf cyffredin dau rhif
"""
ffactorau = []
while mwyaf != 0 and lleiaf != 0:
gweddill = mwyaf % lleiaf
lluosrif = (mwyaf - gweddill) / lleiaf
mwyaf = lleiaf
lleiaf = gweddill
ffactorau.append(lluosrif)
ffactorau.append(mwyaf)
ffactorau.append(lleiaf)
return max(ffactorau)
print(ffactor_cyffredin_mwyaf(1071, 462))
Nawr bod gennym god cryno, darllenadwy, a modwlar (wel ond un ffwythiant oedd angen yn yr achos yma), ysgrifennwn brofion i sicrhau bod hwn yn gweithio fel y disgwylir:
1
2
3
4
5
assert ffactor_cyffredin_mwyaf(1071, 462) == 21
assert ffactor_cyffredin_mwyaf(20, 4) == 5
assert ffactor_cyffredin_mwyaf(101, 60) == 6
assert ffactor_cyffredin_mwyaf(81, 82) == 81
assert ffactor_cyffredin_mwyaf(10, 8) == 4
Ac felly mae gennym ffwythiant y gellir ei ailddefnyddio, wedi ysgrifennu mewn ffordd ddarllenadwy a dealladwy, wedi’i phrofi ar gyfer nifer o achosion.
Cyfeiriadau
-
“Research software development”, Vincent Knight,
⏪ Blaenorol | Nesaf ⏩ |