Ачааллж байна...
Өмнөх хоёр хичээлд бид кодын чанарыг автоматаар сайжруулдаг хоёр хэрэгслийг сурсан. black хэлбэрийг цэгцэлдэг, ruff урхи, үлдэгдлийг олдог. Гэхдээ кодыг ойлгомжтой болгодог хамгийн чухал шийдвэрүүдийг аль ч хэрэгсэл гаргаж чадахгүй. Хувьсагчийг “d” гэж нэрлэх үү, “expenses” гэж үү? Функц хэр урт байх вэ, хэзээ хуваах вэ? Энэ тоо 10 юуг илэрхийлж байна вэ? black “d”-г зайтай, цэвэрхэн байрлуулна, ruff түүнийг ашиглагдаж байгаа тул сэтгэл хангалуун байна. Гэтэл хэдэн сарын дараа кодыг нээсэн хүн “d” гэж юу болохыг ойлгохын тулд бүх функцийг уншиж, тайлах хэрэгтэй болно.
Энэ хичээл хэрэгслийн биш, шийдвэрийн хичээл. Ганц ч command бичихгүй. Python-ий хэв маягийн албан ёсны заавар PEP 8-ийн гол санаануудыг энгийн үгээр сурна. Дараа нь кодыг ойлгомжтой болгодог гурван дадлын тухай ярина: өөрийгөө тайлбарладаг нэр, шударга хэмжээтэй функц, ухаалаг байхаас илүү тууштай байх. Бид нэг ойлгомжгүй функцийг алхам алхмаар засаж, өөрчлөлт бүрийн шалтгааныг тайлбарлана. Энэ хичээлийн дадлуудыг ямар ч хэрэгсэл шалгахгүй, тиймээс тэдгээр нь танд л үлдэнэ.
Сайн газрын зургийг нээгээд та хэдхэн секундэд ойлгодог: цэнхэр шугам гол, хар цэг хот, ногоон талбай ой. Шинэ газрын зураг ч гэсэн ижил тэмдэглэгээтэй тул нэг удаа сурсан хүн дэлхийн аль ч газрын зургийг уншина. Мөн тэмдэг бүрийн хажууд нэр бий: "Туул гол", "Тэрэлж". Одоо тэмдэглэгээ нь зураг бүрт өөр, нэрсийн оронд "Г1", "Х3" гэсэн товчлол бүхий газрын зураг төсөөлөөрэй. Мэдээлэл яг ижил байж болох ч та түүнийг ашиглахын тулд эхлээд зураг бүрийн тайлбарыг судлах хэрэгтэй болно.
Код бол газрын зураг: уншигчийг программын логикоор дагуулдаг. PEP 8-ийн нэрлэх дүрэм бол дэлхий нийтийн тэмдэглэгээ: том үсгээр эхэлсэн нэр класс, бүхэлдээ том үсэг тогтмол утга гэх мэт. Python-ий ямар ч төслийг нээсэн хүн тэр дороо таньдаг. Харин нэр бүр бол газрын нэр: "Г1"-ийн оронд "Туул гол", “d”-ийн оронд “expenses”. Сайн газрын зургийг уншигч ашигладаг, муу газрын зургийг уншигч тайлдаг.
PEP 8 бол Python-ий хэв маягийн албан ёсны заавар бөгөөд 2001 онд Python-ий бүтээгч Гвидо ван Россум болон бусад хөгжүүлэгчид бичжээ. PEP гэдэг нь Python Enhancement Proposal буюу Python-ийг сайжруулах санал гэсэн утгатай бөгөөд 8 нь түүний дугаар. Түүний гол санаа нэг өгүүлбэрт багтдаг: код бичигдэхээсээ хамаагүй олон удаа уншигддаг. Таны өнөөдөр нэг удаа бичсэн функцийг хэдэн сарын дараах та, хамтран ажиллагчид, reviewer олон удаа уншина. Тиймээс бичихэд хялбар биш, уншихад хялбар байдлыг сонгох ёстой.
PEP 8-ийн нэлээд хэсэг нь мөрийн урт, зай, хоосон мөр, import-ын дараалал зэрэг хэлбэрийн тухай. Энэ хэсгийг black ба ruff аль хэдийн таны өмнөөс хийж байна: тэд PEP 8-тэй нийцдэг. Харин PEP 8-ийн нөгөө хэсэг, нэрлэх дүрэм ба кодын бүтцийн тухай зөвлөмж, хүний шийдвэр шаарддаг. Энэ хичээл яг тэр хэсгийн тухай.
PEP 8 нэрийн хэлбэрээр тэр нь юу болохыг хэлдэг тогтсон дүрэм тогтоосон. Энэ сургалтын туршид бид тэдгээрийг баримталж ирсэн, одоо тодорхой нэрлэе.
Функц, хувьсагч, модулийн нэр жижиг үсгээр, үгсийг доогуур зураасаар холбоно: load_items, total_price, receipt.py. Энэ хэлбэрийг snake_case буюу могойн хэлбэр гэдэг. Классын нэр үг бүрийн эхний үсгийг томоор, зураасгүй бичнэ: ReceiptPrinter, ValueError. Энэ хэлбэрийг CapWords гэдэг: 7.4 дүгээр хичээлээс хойш таньж буй ValueError, KeyError бүгд класс тул ийм хэлбэртэй. Програмын туршид өөрчлөгддөггүй тогтмол утгын нэрийг бүхэлд нь том үсгээр бичнэ: VAT_PERCENT, MAX_ITEMS. Доогуур зураасаар эхэлсэн нэр "дотоод" эсвэл "санаатайгаар хэрэглэдэггүй" гэсэн дохио: 11.2 дугаар хичээлийн _name. Мөн PEP 8 жижиг “l”, том “O”, том “I” үсгүүдийг ганцаараа хувьсагчийн нэр болгохгүй байхыг зөвлөдөг, учир нь олон фонтод тэдгээрийг 1 ба 0-оос ялгахад хэцүү.
Эдгээр дүрэм газрын зургийн тэмдэглэгээ шиг ажилладаг: VAT_PERCENT гэсэн нэрийг харангуут уншигч үүнийг хэн ч өөрчлөхгүй тогтмол утга гэдгийг мэднэ, ReceiptPrinter-ийг харангуут класс гэдгийг мэднэ. Тайлбар унших шаардлагагүй.
Хэлбэр бол эхний алхам. Илүү чухал нь нэрийн агуулга: нэр уншигчид юу хэлж байна вэ? Сайн нэрийн хэдэн дадлыг нэрлэе.
Юу гэдгийг хэл, хэрхэн гэдгийг биш. items бол юу гэдгийг хэлдэг. list_of_tuples бол хэрхэн хадгалсныг хэлдэг. Хэрвээ хожим бараануудыг tuple-ийн оронд dictionary-д хадгалдаг болбол хоёр дахь нэр худлаа ярьж эхэлнэ.
Функцийг үйл үгээр. Функц ямар нэг үйлдэл хийдэг тул нэр нь үйл үгээр эхлэх нь байгалийн: load_items, add_vat, format_price. Хувьсагчид харин нэр үгээр: total, items.
Үнэн, худал утгыг асуултаар. True эсвэл False буцаадаг функц, хадгалдаг хувьсагчийн нэр “is_”, “has_” зэргээр эхэлбэл if мөр өгүүлбэр шиг уншигдана: if is_free(amount): нь "хэрвээ дүн үнэгүй бол". 7.3 дугаар хичээлийн is_free яг энэ дадлын жишээ.
Цуглуулгыг олон тоогоор. Жагсаалт items, түүний нэг элемент item. for item in items: мөр өөрөө юуг давтаж байгааг хэлнэ.
Нэгжийг нэрэнд. Тоо ямар нэгжтэй вэ гэдэг нь тодорхойгүй бол нэрэнд оруул: VAT_PERCENT нь 10 гэдэг тоо хувь гэдгийг хэлдэг, VAT нь 10 юм уу, 0.1 юм уу гэдгийг хэлдэггүй. Хугацаанд онцгой чухал: timeout секунд үү, миллисекунд үү? timeout_seconds гэвэл асуулт алга.
Хүрээтэйгээ тэнцүү урттай. Гурван мөр бүхий давталтын доторх i бол бүрэн зөв нэр: түүний хүрээ бүхэлдээ нүдэнд харагдана. Харин модулийн түвшний, олон функцэд хэрэглэгддэг хувьсагчид i хангалтгүй, бүрэн нэр хэрэгтэй. Нэрийн урт уншигч түүнийг хэр холоос харж байгаатай уялдана.
Ерөнхий нэрээс зайлсхий. data, info, temp, value, result, x нь юу ч хэлэхгүй: бараг бүх зүйл өгөгдөл, бараг бүх зүйл утга. Тэдгээрийн оронд тухайн өгөгдөл юу болохыг хэл: expenses, receipt_text, subtotal.
Товчлолоос зайлсхий, гэхдээ хэтрүүлэхгүй. calc_ttl_w_vt уншигчийг тайлахад хүргэнэ. Гэхдээ бүх нийтэд танигдсан товчлолууд, жишээ нь qty (quantity) эсвэл id, хэвийн. Шалгуур: шинэ хүн энэ товчлолыг тайлбаргүйгээр ойлгох уу?
Энэ сургалтын эхэн үед бид дадлагын фолдерт zarlaga, angilal, angilalaar_shuuh гэх мэт монгол үгийг латинаар бичсэн нэрс хэрэглэсэн. Дараа нь зарлагын бүртгэлд болон pytest-dadlaga-д expenses, load_items, format_price гэх мэт англи нэрс рүү шилжсэн. Энэ шилжилт санаатай байсан бөгөөд шалтгааныг шударгаар тайлбарлая.
Англи нэр ашиглах хоёр шалтгаан бий, хоёулаа 2.2 дугаар хичээлийн commit message-ийн сонголттой ижил. Нэгдүгээрт, Python өөрөө, түүний стандарт сан, таны хэрэглэдэг бүх package англи нэртэй: sum, len, json.load. Таны нэрс тэдгээрийн хажууд нэг хэлээр уншигдах нь кодыг жигд болгоно. Хоёрдугаарт, таны код GitHub дээр дэлхийн аль ч хүнд уншигдах боломжтой болно. Харин латинаар бичсэн монгол үгс, жишээ нь zarlaga эсвэл zarlaga_, нэг үгийг хүн бүр өөрөөр галиглаж болдог тул Монгол уншигчид ч заримдаа ойлгомжгүй байдаг.
Энэ нь латин галиглалт хориотой гэсэн үг биш. Хувийн, жижиг, зөвхөн Монгол уншигчдад зориулсан төсөлд энэ бүрэн зөв. Хамгийн чухал дүрэм бол нэг төсөлд нэг хэлийг тууштай хэрэглэх. total_zarlaga гэх мэт холимог нэр хоёр хэлний сул талыг нийлүүлдэг. Харин хэрэглэгчид харагдах текст, жишээ нь "Нийт зарлага:" гэсэн хэвлэх мөр, монгол хэвээр үлдэнэ: энэ бол кодын нэр биш, программын гаралт.
Функц хэр урт байх ёстой вэ? Энэ асуултад “20 мөр” гэх мэт ид шидийн тоо байхгүй бөгөөд тийм тоо санал болгосон дүрэм хэтрүүлэг юм. Харин функц хэт их зүйл хийж байгааг харуулдаг шударга шинжүүд бий.
Нэрлэхэд "ба" хэрэгтэй. Хэрвээ функцийг үнэнээр нь нэрлэхийн тулд “load_and_compute_and_print” гэх хэрэгтэй бол тэр гурван функц. Сайн функц нэг үйл үгээр нэрлэгддэг.
Дотор нь алхмуудыг тусгаарласан тайлбарууд бий. “# Нийт дүнг тооцоолох”, “# Текст бүтээх” гэх мэт тайлбар функцийн доторх хэсгүүдийг тусгаарлаж байвал хэсэг бүр өөрөө нэртэй функц болохыг хүсэж байна. Тайлбар бол функцийн нэр болох гэж оролдож буй мөр.
Олон давхар догол мөр. if дотор for, түүн дотор if, түүн дотор өөр for байх нь уншигчийг олон нөхцлийг нэгэн зэрэг санахад хүргэдэг. Дотоод хэсгийг тусдаа функц болговол давхар бүрийг тусад нь ойлгоно.
Тестлэхэд хэцүү. 9.2 дугаар хичээлийн сургамж энд ч хамаатай: хэрвээ функцийг тестлэхийн тулд файл, хэвлэлт, олон бэлтгэл хэрэгтэй бол тэр нь тооцооллыг гаж нөлөөтэй хольсон байх магадлалтай.
Гэхдээ эсрэг талын хэтрүүлэг ч бий. Нэг мөр бүрийг тусдаа функц болгох нь логикийг олон жижиг хэсэгт тарааж, уншигчийг файлын дээгүүр доогуур үсрүүлдэг. Хэрвээ функцийн нэр түүний кодоос урт, ойлгомжгүй бол хуваах шаардлагагүй. Шалгуур нь урт биш, нэг санаа: функц бүр нэг санааг нэг түвшинд илэрхийлэх ёстой.
Өмнө
Доорх функц ажилладаг, black-ийн хэлбэрт нийцдэг, ruff ч анхааруулга өгөхгүй. Үүнийг кодыг уншиж, юу хийдгийг ойлгох гэж оролдоорой.
python
def calc(d, t=10):
r = 0
for x in d:
if x[2] >= 10:
r = r + x[1] * x[2] * 95 // 100
else:
r = r + x[1] * x[2]
r2 = r + r * t // 100
s = ""
for x in d:
s = s + x[0] + ": " + str(x[1] * x[2]) + "\n"
s = s + "Нийт: " + str(r2)
print(s)
return r2Хэдэн секундэд ойлгосон уу? Ихэнх хүн хэдэн минут зарцуулна. Асуудлуудыг нэрлэе. Нэрс юу ч хэлэхгүй: calc, d, t, r, x, r2, s. x[1], x[2] гэсэн индексүүд ямар утгыг заахыг уншигч өөрөө таах ёстой. 10, 95, 100 гэсэн тоонууд тайлбаргүй: эхний 10 ба t-ийн 10 нэг зүйл үү? Функц хэт олон зүйл хийж байна: мөр бүрийн дүнг бөөний хөнгөлөлттэй тооцоолох, татвар нэмэх, текст бүтээх, хэвлэх. Хэвлэх нь 9.2 дугаар хичээлийн гаж нөлөө, тооцоололтой холилдсон.
Алхам 1: Ид шидийн тоонуудыг нэрлэх
Тайлбаргүй тоог “magic number” буюу ид шидийн тоо гэдэг: тэр кодонд ид шидээр гарч ирсэн мэт, утга нь тодорхойгүй. Тэдгээрийг нэртэй тогтмол болгоё.
python
VAT_PERCENT = 10
BULK_QUANTITY = 10
BULK_DISCOUNT_PERCENT = 5Одоо хоёр өөр “10” ялгагдлаа: нэг нь татварын хувь, нөгөө нь бөөний хөнгөлөлт эхлэх тоо ширхэг. Хэрвээ хожим татвар өөрчлөгдвөл нэг газар засна, тэгээд бөөний хязгаарыг санамсаргүй өөрчлөхгүй. 95-ын оронд 5 хувийн хөнгөлөлт гэж бичсэн нь илүү ойлгомжтой: “95 хувийг төлнө” гэхээс “5 хувийн хөнгөлөлт” гэдэг нь бизнесийн хэлтэй ойр.
Алхам 2: Нэг санаа, нэг функц
Функцийн дотор дөрвөн санаа бий. Тус бүрийг нэртэй функц болгоё.
python
def line_total(price, qty):
total = price * qty
if qty >= BULK_QUANTITY:
total = total * (100 - BULK_DISCOUNT_PERCENT) // 100
return total
def add_vat(amount):
return amount + amount * VAT_PERCENT // 100
def order_total(items):
subtotal = sum(line_total(price, qty) for _name, price, qty in items)
return add_vat(subtotal)
def order_text(items):
lines = [f"{name}: {price * qty}" for name, price, qty in items]
lines.append(f"Нийт: {order_total(items)}")
return "\n".join(lines)Өөрчлөлт бүрийг тайлбарлая. x[1] ба x[2] гэсэн индексүүдийн оронд tuple-ийг name, price, qty болгон задалсан: одоо код юу үржүүлж байгаагаа хэлж байна. Хөнгөлөлтийн тооцоо line_total-д, татвар add_vat-д, нэгтгэл order_total-д, текст order_text-д. Функц бүрийн нэр нэг үйл үг, "ба"-гүй. Хэвлэх үйлдэл функцуудаас бүрмөсөн гарсан: 9.2 дугаар хичээлийн санаагаар order_text текстийг буцаана, дуудагч, жишээ нь main.py, түүнийг хэвлэнэ.
Танил санагдаж байна уу? 10.1 дүгээр хичээлийн order.py яг ийм бүтэцтэй байсан. Тэр үед бид бүтцийн тухай яриагүй ч одоо яагаад тийм бичсэн нь тодорхой: line_total-ийг тусад нь тестлэх боломжтой байсан тул 10.1 дүгээр хичээлд алдааг хайхдаа “line_total зөв” гэсэн таамаглалыг хурдан шалгаж чадсан.
Нарийн нэг зүйл: зан төлөвийг хадгалах
Нэг мөрийг анзаараарай: total * (100 - BULK_DISCOUNT_PERCENT) // 100. Яагаад илүү энгийн мэт total - total * BULK_DISCOUNT_PERCENT // 100 биш вэ? Хоёулаа ижил санааг илэрхийлдэг, гэхдээ бүхэл хуваалт тайралтаас болж зарим тоонд өөр үр дүн өгдөг. Жишээ нь 999-д эхний арга 999 * 95 // 100 = 949, хоёр дахь арга 999 - 999 * 5 // 100 = 999 - 49 = 950. Нэг төгрөгийн ялгаа. Анхны calc функц эхний аргыг хэрэглэж байсан тул бид түүнийг хадгалсан.
Энэ бол 9.2 дугаар хичээлийн refactoring-ийн дүрмийн бодит жишээ: кодын бүтцийг сайжруулахдаа зан төлөвийг нь өөрчлөх ёсгүй, нэг төгрөг ч. Ийм нарийн ялгааг нүдээрээ олоход хэцүү. Тиймээс бодит төсөлд ийм өөрчлөлтийн өмнө хуучин функцийн тестүүд байх ёстой: 999 гэх мэт хил дээрх утгатай тест энэ ялгааг шууд барина. Мөн t параметрийг устгасныг анзаараарай: хэрвээ хэн нэгэн calc-ийг өөр татвартай дуудаж байсан бол энэ өөрчлөлт тэр кодыг эвдэнэ. Бодит төсөлд функцийн гарын үсгийг өөрчлөхөөс өмнө түүнийг хаана хэрэглэдгийг хайх ёстой.
Дараа
Өмнө ба дараах хоёр хувилбарыг харьцуулаарай. Дараах хувилбар илүү урт: 14 мөрийн оронд 21 мөр, гурван тогтмол. Гэхдээ функц бүрийг хэдэн секундэд ойлгоно. Алдааг хайхад аль функцийг сэжиглэхээ нэрээр нь мэднэ. Тест бичихэд функц бүр тусдаа, бэлтгэлгүй тестлэгдэнэ. Код урт болсон ч ойлгоход шаардлагатай хугацаа богиноссон. Энэ бол чанартай кодын жинхэнэ хэмжүүр: мөрийн тоо биш, уншигчийн зарцуулах хугацаа.
Тайлбар: яагаад, юу биш
Сайн нэр олон тайлбарын хэрэгцээг арилгадаг. r = r + x[1] * x[2] # мөрийн дүнг нэмнэ гэсэн тайлбар нэрсийн муу байдлыг нөхөх гэж оролдож байна. subtotal += line_total(price, qty) бол тайлбар хэрэггүй. Кодын юу хийж байгааг давтсан тайлбар, жишээ нь total = 0 # total-ийг тэг болгоно, юу ч нэмэхгүй бөгөөд код өөрчлөгдөхөд хуучирч, худлаа ярьж эхэлдэг.
Харин тайлбар яагаад гэдгийг хэлэхэд үнэ цэнэтэй: кодоос харагдахгүй шалтгааныг. Жишээ нь:
python
# Нягтлан бодох бүртгэлийн дүрмээр хөнгөлөлтийг доош тайрна.
total = total * (100 - BULK_DISCOUNT_PERCENT) // 100Энэ тайлбар кодын юу хийж байгааг биш, яагаад яг ингэж хийж байгааг хэлж байна. Хэдэн сарын дараа хэн нэгэн "дээш тойруулбал илүү зөв биш үү" гэж бодоход энэ тайлбар түүнийг зогсооно. Функц, модуль бүхэлдээ юу хийдгийг тайлбарлах арга нь docstring бөгөөд түүнийг дараагийн хичээлд сурна.
Нэр худлаа ярих үед
Нэргүй кодоос муу зүйл бол худлаа ярьдаг нэр. get_items() гэсэн функц бараануудыг буцаахын зэрэгцээ файлд бичдэг бол уншигч түүнийг аюулгүй гэж бодоод олон удаа дуудаж магадгүй. is_valid(item) гэсэн функц True, False-ийн оронд алдааны мессеж буцаадаг бол if is_valid(item): мөр үргэлж үнэн болно. Кодыг өөрчлөхөд нэр бас өөрчлөгдөх ёстой: функц өөр зүйл хийдэг болсон бол нэр нь ч дагаж өөрчлөгдөнө.
Нэр солиход бүх хэрэглээг олж солих хэрэгтэй. VS Code-д нэр дээр курсор тавиад F2 дарвал “Rename Symbol” буюу нэр солих цонх нээгдэж, тэр нэрийн бүх хэрэглээг, бусад файлд ч, нэг дор солино. Гараар хайж солихоос хавьгүй найдвартай. Дараа нь тест ажиллуулахыг мартахгүй.
Тууштай байх нь ухаалаг байхаас дээр
Python бүх зүйлийг нэг мөрөнд шахах олон боломж олгодог.
python
total = sum(p * q * (95 if q >= 10 else 100) // 100 for _, p, q in d) * 110 // 100Энэ мөр calc-ийн тооцоог бүхэлд нь нэг мөрөнд хийж байна. Бичсэн хүн ухаалаг санагдаж магадгүй. Гэхдээ уншигч энэ мөрийг ойлгохын тулд calc-ийн бүх функцээс ч илүү хугацаа зарцуулна. Ухаалаг код бичигчдээ таашаал өгдөг, ойлгомжтой код уншигчдад. Мөн PEP 8 өөрөө нэг чухал зөвлөгөө өгдөг: хэв маягийн дүрмүүдээс ч илүү чухал нь тухайн төсөл доторх тууштай байдал. Хэрвээ та одоо байгаа төсөлд нэгдэж, тэнд таны дургүй хэв маяг тогтсон бол түүнийг дагах нь өөрийн хэв маягийг оруулахаас дээр. Нэг файлын хагас нь нэг хэв маягтай, хагас нь өөр хэв маягтай байх нь аль нэгийг нь тууштай хэрэглэхээс уншихад хэцүү.
Хүсвэл өмнөх сургалтын аль нэг төслөө, эсвэл зарлагын бүртгэлээ нээгээд энэ хичээлийн нүдээр уншаарай. Юу ч хийх шаардлагагүй гэсэн ганц шаардлагатайгаар гурван зүйл олоорой: юу ч хэлэхгүй нэг нэр, нэг ид шидийн тоо, нэрлэхэд "ба" хэрэгтэй нэг функц. Хэрвээ засахаар шийдвэл нэрийг VS Code-ийн F2-оор солиорой, тоог нэртэй тогтмол болгоорой, функцийг хуваагаарай. Өөрчлөлт бүрийн дараа pytest ажиллуулж, бүх зүйл ажилласаар байгааг баталгаажуулаарай. Тест байхгүй хэсгийг өөрчлөх бол эхлээд тест бичээрэй: энэ хичээлийн 999-ийн жишээ яагаад гэдгийг харуулсан.
Товчлолоор хэмнэх. calc_ttl, usr_inp, tmp_lst гэх мэт нэрс бичих үед хэдэн секунд хэмнэх ч уншигч бүрийн хэдэн секундийг авна. Код олон удаа уншигддаг тул хэмнэлт бодитоор алдагдал болдог. VS Code бичих явцад нэрсийг автоматаар гүйцээдэг тул урт нэр бичихэд бараг цаг ордоггүй.
Хэт урт нэр. Эсрэг хэтрүүлэг ч бий: list_of_all_expenses_loaded_from_the_json_file уншихад ядаргаатай. Нэр тухайн хүрээнд хангалттай мэдээлэл өгөх ёстой, бүх түүхийг биш. Функцийн дотор expenses хангалттай, хаанаас ирснийг функцийн нэр эсвэл docstring хэлнэ.
Нэг санаагаа хэд хэдэн нэрээр нэрлэх. Нэг газар items, өөр газар products, гуравдахь газар goods гэж ижил зүйлийг нэрлэвэл уншигч тэдгээрийг гурван өөр зүйл гэж бодно. Нэг ойлголт, нэг нэр, бүх төслийн туршид.
Функцийг хэт жижиглэх. Нэг мөр бүхий функц бүр, жишээ нь def multiply(a, b): return a * b, логикийг тарааж, уншигчийг үсрүүлдэг. Функц нэр нь кодоос илүү утга нэмэх үед л хэрэгтэй. line_total утга нэмдэг: бөөний хөнгөлөлтийн дүрмийг агуулж, нэрлэдэг. multiply утга нэмдэггүй.
Зан төлөвийг өөрчлөх refactoring. Энэ хичээлийн 999-ийн жишээ харуулсанчлан "ижил санааг өөрөөр бичих" нь заримдаа үр дүнг өөрчилдөг. Бүтцийг сайжруулах бүрт эхлээд тест, дараа нь өөрчлөлт, дараа нь дахин тест. Хэрвээ та ямар нэг өөрчлөлт хийхдээ "энэ ижил зүйл" гэдэгт бүрэн итгэлтэй биш байвал тестгүйгээр бүү хий.
Кодыг тайлбараар засах. Ойлгомжгүй кодын дээр урт тайлбар бичих нь сайн санаа мэт санагдаж болох ч кодыг өөрийг нь ойлгомжтой болгох нь бараг үргэлж илүү дээр. Тайлбар бичих гэж байгаа бол эхлээд өөрөөсөө асуу: нэр эсвэл бүтцийг өөрчилснөөр энэ тайлбар хэрэггүй болох уу?
black ба ruff хэлбэр болон урхийг шийддэг ч кодыг ойлгомжтой болгодог шийдвэрүүд, нэрс ба бүтэц, хүнд үлддэг. PEP 8 бол Python-ий хэв маягийн албан ёсны заавар бөгөөд гол санаа нь код бичигдэхээсээ олон удаа уншигддаг. Нэрлэх дүрэм: функц, хувьсагч, модуль snake_case, класс CapWords, тогтмол UPPER_SNAKE_CASE, доогуур зураасаар эхэлсэн нэр дотоод эсвэл ашиглагдаагүй. Сайн нэр юу гэдгийг хэлдэг, функцийг үйл үгээр, үнэн худлыг асуултаар, цуглуулгыг олон тоогоор, шаардлагатай бол нэгжийг нэрэнд, хүрээтэйгээ тэнцүү урттай нэрлэдэг, ерөнхий нэр ба тайлагдахгүй товчлолоос зайлсхийдэг. Нэг төсөлд нэг хэлийг тууштай хэрэглэнэ, англи нэрс хуваалцах кодонд илүү тохиромжтой. Функцийн уртад ид шидийн тоо байхгүй: нэрлэхэд "ба" хэрэгтэй, доторх тайлбарууд алхмуудыг тусгаарласан, олон давхар догол мөр, тестлэхэд хэцүү байх нь хуваах дохио, харин хэт жижиглэх нь логикийг тараадаг. Ид шидийн тоог нэртэй тогтмол болгоно. Тайлбар юу биш, яагаад гэдгийг хэлнэ. Нэр солиход VS Code-ийн F2. Refactoring зан төлөвийг өөрчлөх ёсгүй, тиймээс тестийн өмнө ба дараа. Ухаалаг байхаас илүү тууштай, ойлгомжтой байх.
Дараагийн хичээлд энэ хичээлийн "яагаад" гэсэн тайлбарын санааг функц ба модулийн түвшинд хүргэнэ: docstring. Ирээдүйн уншигчид функц юу хийдэг, юу хүлээн авч, юу буцаадгийг кодын дотор нь, кодтой нь хамт хадгалагддаг хэлбэрээр хэлж, Python-ий help() функц тэдгээрийг хэрхэн харуулдгийг харна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.