A4B99RPH: Řešení problémů a hry Čistý kód.

Podobné dokumenty
B4B33RPH: Řešení problémů a hry PEP 8. Čistý kód.

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

1, Žáci dostanou 5 klíčových slov a snaží se na jejich základě odhadnout, o čem bude následující cvičení.

WORKSHEET 1: LINEAR EQUATION 1

Tento materiál byl vytvořen v rámci projektu Operačního programu Vzdělávání pro konkurenceschopnost.

Dynamic programming. Optimal binary search tree

2. Entity, Architecture, Process

VY_32_INOVACE_06_Předpřítomný čas_03. Škola: Základní škola Slušovice, okres Zlín, příspěvková organizace

Čipové karty Lekařská informatika

Next line show use of paragraf symbol. It should be kept with the following number. Jak může státní zástupce věc odložit zmiňuje 159a.

Transportation Problem

Název projektu: Multimédia na Ukrajinské

Litosil - application

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

EXACT DS OFFICE. The best lens for office work

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Czech Republic. EDUCAnet. Střední odborná škola Pardubice, s.r.o.

Název společnosti: VPK, s.r.o. Vypracováno kým: Ing. Michal Troščak Telefon: Datum:

Jak importovat profily do Cura (Windows a

UPM3 Hybrid Návod na ovládání Čerpadlo UPM3 Hybrid 2-5 Instruction Manual UPM3 Hybrid Circulation Pump 6-9

CODE BOOK NEISS 8. A code book is an identification tool that allows the customer to perform a test result evaluation using a numeric code.

Introduction to MS Dynamics NAV

Gymnázium, Brno, Slovanské nám. 7 WORKBOOK. Mathematics. Teacher: Student:

TechoLED H A N D B O O K

Gymnázium, Brno, Slovanské nám. 7, SCHEME OF WORK Mathematics SCHEME OF WORK. cz

Vánoční sety Christmas sets

ČTENÍ. M e t o d i c k é p o z n á m k y k z á k l a d o v é m u t e x t u :

JAVA. Další jazyky kompilovatelné do Java byte-code

Název projektu: Multimédia na Ukrajinské

EU peníze středním školám digitální učební materiál

Střední odborná škola stavební a Střední odborné učiliště stavební Rybitví

Agile leadership in Czech Rep. Agilia Conference 2011 Brno

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

LOGOMANUÁL / LOGOMANUAL

ITICA. SAP Školení přehled Seznam kurzů

Jak postupovat při zpracování jednotlivých částí testu: Flyers

Cambridge International Examinations Cambridge International General Certificate of Secondary Education

Název společnosti: VPK, s.r.o. Vypracováno kým: Ing. Michal Troščak Telefon: Datum:

Automatika na dávkování chemie automatic dosing

Agilní metodiky vývoje softwaru

POSLECH. Anglický jazyk 9. třída Mgr. Martin Zicháček. Jazyk Úroveň Autor Kód materiálu. Z á k l a d o v ý t e x t :

O makrech, která umí aritmetiku s velkými čísly. Macros Which Handle Arithmetics with Big Numbers. Jan Šustek KMa PřF OU. Brejlov

Caroline Glendinning Jenni Brooks Kate Gridley. Social Policy Research Unit University of York

GUIDELINES FOR CONNECTION TO FTP SERVER TO TRANSFER PRINTING DATA

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

My Year Manager is Vedoucí našeho ročníku je. P.E. is on Tělocvik mám v

Social Media a firemní komunikace

Postup objednávky Microsoft Action Pack Subscription

Výukový materiál zpracován v rámci projektu EU peníze školám

Výukový materiál zpracovaný v rámci operačního programu Vzdělávání pro konkurenceschopnost

RIMINI. Samozavírací hydraulické závěsy Self-closing hydraulic hinges

Škola: Střední škola obchodní, České Budějovice, Husova 9. Inovace a zkvalitnění výuky prostřednictvím ICT

Střední odborná škola a Střední odborné učiliště, Chrudim, Čáslavská

Housework, professions, jobs, services, tradition/culture.

Právní formy podnikání v ČR

Compression of a Dictionary

Hacking Team - exploity a zranitelnosti v programech. Petr Hanáček Fakulta informačních technologií, VUT v Brně

Výukový materiál zpracovaný v rámci operačního programu Vzdělávání pro konkurenceschopnost

Immigration Studying. Studying - University. Stating that you want to enroll. Stating that you want to apply for a course.

Immigration Studying. Studying - University. Stating that you want to enroll. Stating that you want to apply for a course.

Tabulka 1 Stav členské základny SK Praga Vysočany k roku 2015 Tabulka 2 Výše členských příspěvků v SK Praga Vysočany Tabulka 3 Přehled finanční

Evoluční algoritmy. Podmínka zastavení počet iterací kvalita nejlepšího jedince v populaci změna kvality nejlepšího jedince mezi iteracemi

Chapter 7: Process Synchronization

VY_22_INOVACE_84. P3 U3 Revision

POSLECH. M e t o d i c k é p o z n á m k y k z á k l a d o v é m u t e x t u :

Cambridge International Examinations Cambridge International General Certificate of Secondary Education

Číslo materiálu: VY 32 INOVACE 29/18. Číslo projektu: CZ.1.07/1.4.00/

2N Voice Alarm Station

POSLECH. M e t o d i c k é p o z n á m k y k z á k l a d o v é m u t e x t u :

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Kód: Vzdělávací materiál projektu Zlepšení podmínek výuky v ZŠ Sloup. Present simple "to have, to be"

Automatické testování softwaru. Testujte svůj kód! Předpoklady: Příklad: sum_digits() Možnost 1: Zkusíme funkci použít v konzoli Pythonu.

Programování v Pythonu

Škola: Střední škola obchodní, České Budějovice, Husova 9. Inovace a zkvalitnění výuky prostřednictvím ICT

Čtvrtý Pentagram The fourth Pentagram

Škola: Střední škola obchodní, České Budějovice, Husova 9. Inovace a zkvalitnění výuky prostřednictvím ICT

POSLECH. Mona has got her eleventh birthady on Sathurday, she she is planning a big party for her friends. She met her friend John.

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Izolační manipulační tyče typ IMT IMT Type Insulated Handling Rod

1-AYKY. Instalační kabely s Al jádrem. Standard TP-KK-133/01, PNE Konstrukce. Použití. Vlastnosti. Installation cables with Al conductor

VY_22_INOVACE_60 MODAL VERBS CAN, MUST

VYUŽITÍ DATA DRIVEN PAGES

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

PRODEJNÍ EAUKCE A JEJICH ROSTOUCÍ SEX-APPEAL SELLING EAUCTIONS AND THEIR GROWING APPEAL

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

The Over-Head Cam (OHC) Valve Train Computer Model

Projekt: ŠKOLA RADOSTI, ŠKOLA KVALITY Registrační číslo projektu: CZ.1.07/1.4.00/ EU PENÍZE ŠKOLÁM

VYSOKÁ ŠKOLA HOTELOVÁ V PRAZE 8, SPOL. S R. O.

DUM DIGITÁLNÍ UČEBNÍ MATERIÁL ANGLIČTINA. Mgr. Kateřina Kasanová

User manual SŘHV Online WEB interface for CUSTOMERS June 2017 version 14 VÍTKOVICE STEEL, a.s. vitkovicesteel.com

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

První kapitola úvod do problematiky

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Jméno autora: Mgr. Alena Chrastinová Datum vytvoření: Číslo DUMu: VY_32_INOVACE_O7_AJ

Přítomný čas prostý/ průběhový. Present simple/ present continuous. Výhradní výukový materiál portálu onlinejazyky.cz

VZDĚLÁVACÍ MATERIÁL. Závěrečná písemná práce pro 5. ročník z anglického jazyka Mgr. Iveta Milostná VY_32_INOVACE_A19 Pořadové číslo: 19.

Výukový materiál zpracovaný v rámci projektu EU peníze do škol. illness, a text

Měření dat Filtrace dat, Kalmanův filtr

Postřehová hra. Zadání projektu. 1 Moje cíle

2N LiftIP. IO Extender. Communicator for Lifts. Version

Transkript:

A4B99RPH: Řešení problémů a hry Čistý kód. Petr Pošík Katedra kybernetiky ČVUT FEL Clean Code 2 Který kód je čistší? A proč?........................................................................................... 3 Co je clean code?.................................................................................................. 4 Čistý kód v praxi................................................................................................... 5 Smysluplná jména.................................................................................................. 6 Eratostenovo síto: smysluplná jména.................................................................................. 7 Komentáře......................................................................................................... 8 Eratostenovo síto: komentáře......................................................................................... 9 Funkce a metody................................................................................................... 10 Eratostenovo síto: funkce........................................................................................... 11 Eratostenovo síto: převod na třídu................................................................................... 12 Eratostenovo síto: funkce a třída?.................................................................................... 13 Závěr............................................................................................................. 14 1

Clean Code Zpracováno podle Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship, Prentice Hall, 2008. 2 / 14 Který kód je čistší? A proč? Dvě implementace téhož algoritmu: f = [True for i in range(max_value+1)] f[0] = f[1] = False for i in range(2, len(f)): if f[i]: i is still a candidate for j in range(2*i, len(f), i): f[j] = False primes = [i for i in range(len(f)) if f[i]] if max_value < 2: return [] else: candidates = init_integers_up_to(max_value) mark_non_primes(candidates) return collect_remaining(candidates) def init_integers_up_to(max_value): return [PRIME for i in range(max_value+1)] def mark_non_primes(candidates): Mark 0 and 1, they are not primes. if candidates[number] == PRIME: mark_as_not_prime_multiples_of(number, candidates) def mark_as_not_prime_multiples_of(number, candidates): for multiple in range(2*number, len(candidates), number): def collect_remaining(candidates): P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 3 / 14 Co je clean code? Bjarne Stroustrup, autor jazyka C++ a knihy The C++ Programming Language : I like my code to be elegant and efficient. The logic should be straightforward to make it hard for bugs to hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as not to tempt people to make the code messy with unprincipled optimizations. Clean code does one thing well. Grady Booch, autor knihy Object Oriented Analysis and Design with Applications : Clean code is simple and direct. Clean code reads like well-written prose. Clean code never obscures the designer s intent but rather is full of crisp abstractions and straightforward lines of control. Dave Thomas, zakladatel firmy OTI (převzata firmou IBM v roce 1996), kmotr Eclipse: Clean code can be read, and enhanced by a developer other than its original author. It has unit and acceptance tests. It has meaningful names. It provides one way rather than many ways for doing one thing. It has minimal dependencies, which are explicitly defined, and provides a clear and minimal API. P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 4 / 14 2

Čistý kód v praxi Jediné správné měřítko kvality kódu: Co-to-k-čerty za minutu P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 5 / 14 Smysluplná jména Vymyslet dobrá jména je velmi těžké! Věnujte tomu dostatečnou pozornost! Nebojte se jméno změnit, přijdete-li na lepší! Dobré jméno odhaluje autorův záměr (intention-revealing). Pokud jméno vyžaduje komentář, neodhaluje záměr. Porovnejte: self.d = 0 Elapsed time in days self.elapsed_time_in_days = 0 Názvy tříd: podstatná jména (s přívlastky): Customer, WikiPage, AddressParser, Filter, StupidFilter, Corpus, TrainingCorpus Názvy funkcí/metod: slovesa (s předmětem): post_payment, delete_page, save, train, test, get_email Jeden termín pro jeden koncept! Nepoužívejte stejné slovo k více účelům! Nebojte se dlouhých jmen! Dlouhé popisné jméno je lepší než dlouhý popisný komentář. Čím delší oblast platnosti proměnné, tím popisnější jméno by měla mít. Používejte pojmenované konstanty místo magických čísel v kódu! P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 6 / 14 3

Eratostenovo síto: smysluplná jména f = [True for i in range(max_value+1)] f[0] = f[1] = False for i in range(2, len(f)): if f[i]: i is still a candidate for j in range(2*i, len(f), i): f[j] = False primes = [i for i in range(len(f)) if f[i]] candidates = [ PRIME for i in range(max_value+1)] if candidates[number]==prime: for multiple in \ range(2*number, len(candidates), number): Další smyslupná jména budou následovat!!! P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 7 / 14 Komentáře Čistý kód komentáře (skoro) nepotřebuje! Komentáře kompenzují naše selhání vyjádřit se v prog. jazyce. Porovnej: Check to see if the employee is eligible for full benefits if (employee.flags & HOURLY_FLAG) and (employee.age > 65): versus if employee.is_eligible_for_full_benefits(): Komentáře lžou! Ne vždy a ne záměrně, ale až příliš často! Nepřesné komentáře jsou horší než žádné komentáře! Komentáře nenapraví špatný kód! Dobré komentáře: (do)vysvětlení, (do)upřesnění zdůraznění, varování před následky TODOs Špatné komentáře: staré (už neplatné), bezvýznamné, nevhodné, redundantní, nebo zavádějící komentáře komentáře z povinnosti zakomentovaný kód nelokální nebo nadbytečné informace P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 8 / 14 4

Eratostenovo síto: komentáře This function generates prime numbers up to a user specified maximum. The algorithm used is the Sieve of Eratosthenes. Eratosthenes of Cyrene, b. c. 276 BC, Cyrene, Libya -- d. c. 194 BC, Alexandria. The first man to calculate the circumference of the Earth. Also known for working on calendars with leap years and ran the library at Alexandria. The algorithm is quite simple. Given an array of integers starting at 2, cross out all multiples of 2. Find the next uncrossed integer, and cross out all of its multiples. Repeat until you have passed the maximum value. @author hugo @version 1 This function generates prime numbers up to a user specified maximum. The algorithm used is the Sieve of Eratosthenes. Given an array of integers starting at 2, cross out all multiples of 2. Find the next uncrossed integer, and cross out all of its multiples. Repeat until you have passed the maximum value. @author hugo @version 1 Za chvíli se zbavíme dalších komentářů! P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 9 / 14 Funkce a metody Funkce by měly být krátké! (A ještě kratší!) Funkce by měla dělat právě 1 věc a měla by ji dělat dobře. (A bez vedlejších efektů.) Funkce dlouhé méně než 5 řádků: Většinou dělají právě 1 věc. Mohou mít přesné a výstižné jméno. Nemohou obsahovat vnořené příkazy if, for,... Bloky uvnitř příkazů if, for,... jsou pouze 1 řádek dlouhé Krátké funkce umožňují testovat dílčí části algoritmu! Sekce uvnitř funkcí/metod: Jasná indikace toho, že funkce/metoda nedělá jen 1 věc a měla by být rozdělena. Argumenty funkcí/metod: Udržujte jejich počet malý! 0, 1, 2, výjimečně 3. Vytvořte jméno tak, aby evokovalo pořadí argumentů. Boolovské argumenty funkcí často značí, že funkce nedělá 1 věc! Rozdělte ji. P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 10 / 14 5

Eratostenovo síto: funkce candidates = [ PRIME for i in range(max_value+1)] if candidates[number]==prime: for multiple in \ range(2*number, len(candidates), number): if max_value < 2: return [] else: candidates = init_integers_up_to(max_value) mark_non_primes(candidates) return collect_remaining(candidates) def init_integers_up_to(max_value): return [PRIME for i in range(max_value+1)] def mark_non_primes(candidates): Mark 0 and 1, they are not primes. if candidates[number] == PRIME: mark_as_not_prime_multiples_of(number, candidates) def mark_as_not_prime_multiples_of(number, candidates): for multiple in range(2*number, len(candidates), number): def collect_remaining(candidates): P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 11 / 14 Eratostenovo síto: převod na třídu if max_value < 2: return [] else: candidates = init_integers_up_to(max_value) mark_non_primes(candidates) return collect_remaining(candidates) def init_integers_up_to(max_value): return [PRIME for i in range(max_value+1)] def mark_non_primes(candidates): Mark 0 and 1, they are not primes. if candidates[number] == PRIME: mark_as_not_prime_multiples_of(number, candidates) def mark_as_not_prime_multiples_of(number, candidates): for multiple in range(2*number, len(candidates), number): def collect_remaining(candidates): class PrimesGenerator: Prime numbers generator. def init (self): self.candidates = [] self.max = None def get_primes_up_to(self, max_value): Return list of primes up to the max_value. if max_value < 2: return [] self.max = max_value+1 self.init_candidates_up_to_max_value() self.mark_non_prime_candidates() return self.collect_remaining_candidates() def init_candidates_up_to_max_value(self): self.candidates = [PRIME for i in range(self.max)] def mark_non_prime_candidates(self): Cross out 0 and 1, they are not primes. self.candidates[0] = self.candidates[1] = NONPRIME for number in range(2, int(self.max**0.5)+1): if self.candidates[number]==prime: self.mark_as_not_prime_multiples_of(number) def mark_as_not_prime_multiples_of(self, number): for multiple in range(2*number, self.max, number): self. def collect_remaining_candidates(self): return [i for i in range(self.max) if self.candidates[i]==prime] P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 12 / 14 6

Eratostenovo síto: funkce a třída? class PrimesGenerator: Prime numbers generator. def init (self): self.candidates = [] self.max = None def get_primes_up_to(self, max_value): Return list of primes up to the max_value. if max_value < 2: return [] self.max = max_value+1 self.init_candidates_up_to_max_value() self.mark_non_prime_candidates() return self.collect_remaining_candidates() def init_candidates_up_to_max_value(self): self.candidates = [PRIME for i in range(self.max)] def mark_non_prime_candidates(self): Cross out 0 and 1, they are not primes. self.candidates[0] = self.candidates[1] = NONPRIME for number in range(2, int(self.max**0.5)+1): if self.candidates[number]==prime: self.mark_as_not_prime_multiples_of(number) def mark_as_not_prime_multiples_of(self, number): for multiple in range(2*number, self.max, number): self. def collect_remaining_candidates(self): return [i for i in range(self.max) if self.candidates[i]==prime] Return a list of primes up to the max_value. if max_value < 2: return [] candidates = CandidateNumberList(max_value) candidates.checkout_multiples() return candidates.collect_remaining() class CandidateNumberList: List of boolean values for use in the Sieve of Eratosthenes. Shall be used with the generate_primes_up_to function. def init (self, max_value): self.max = max_value + 1 self.candidates = [PRIME for i in range(self.max)] self.candidates[0] = self.candidates[1] = NONPRIME def checkout_multiples(self): Mark multiples of all prime numbers as not prime. for number in range(2, int(self.max**0.5)+1): if self.candidates[number] == PRIME: self.checkout_multiples_of(number) def checkout_multiples_of(self, number): Mark multiples of number as not prime. for multiple in range(2*number, self.max, number): self. def collect_remaining(self): Return a list of remaining candidates, they are prime. return [i for i in range(self.max) if self.candidates[i]==prime] P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 13 / 14 Závěr Čistý kód je subjektivní pojem, přesto by se o něj měl každý programátor snažit. Čistý kód by měl být především čitelný (skoro jako v přirozeném jazyce). 80 % čistého kódu jsou správně zvolená jména! Vhodná jména lze volit, jsou-li funkce/metody dostatečně krátké! Opakují-li se ve vašem programu stejné nebo podobné kusy kódu, prakticky vždy je možné takový kód definovat jako samostatnou funkci/metodu. P. Pošík c 2012 A4B99RPH: Řešení problémů a hry 14 / 14 7