O stylu programowania Jacek Cichoń Jacek.Cichon@pwr.edu.pl Katedra Informatyki Wydział Podstawowych Problemów Techniki Politechnika Wrocławska 30 listopada 2017 J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 1 / 12
O mnie Zainteresowania naukowe matematyka: teoria mnogości, topologia, teoria miary,... informatyka teoretyczna: algorytmika, algorytmy zrandomizowane, big data, sieci Ad Hoc,... Dydaktyka matematyka: analiza, algebra, matematyka dyskretna, rachunek prawdopodobieństwa,... informatyka: Big Data, WWW, grafika, automatyczna weryfikacja, kursy programowania, bazy danych,... J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 2 / 12
Studenci Informatyki WPPT - I rok Podstawowe informacje Liczba studentów: ok. 120 osób. Próg rekrutacji: około 410 punktów Maksymalny wynik: 537 pkt. Jest więc dobrze To można było wyczuć już na pierwszych wykładach. J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 3 / 12
Studenci Informatyki WPPT - I rok Podstawowe informacje Liczba studentów: ok. 120 osób. Próg rekrutacji: około 410 punktów Maksymalny wynik: 537 pkt. Jest więc dobrze To można było wyczuć już na pierwszych wykładach. J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 3 / 12
Kilka zasad poprawnego programowania DRY Do not repeat yourself KISS Keep it simple, stupid Single Responsibility Principle Do one thing and do it well J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 4 / 12
Wstęp do Informatyki i Programowania Zadanie 2.1 W Polsce używamy następujacych monet i banknotów: monety: 1 gr, 2 gr, 5 gr, 10 gr, 20 gr, 50 gr, 1 zł, 2 zł, 5 zł banknoty: 10 zł, 20 zł, 50 zł, 100 zł, 200 zł, 500 zł. Napisz w języku C program, który czyta kwotę podana w postaci całkowitej liczby złoty i całkowitej liczby groszy a następnie drukuje w jaki sposób wypłacić ja jak najmniejsza całkowita liczba banknotów i monet. J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 5 / 12
Pierwsze podejście const unsigned short CURRENCY_PRIMARY_VALUES [ ] = {500,200,100,50,20,10,5,2,1; const unsigned short CURRENCY_SECONDARY_VALUES [ ] = {50,20,10,5,2,1; i n t main ( ) { unsigned short PRIMARY_VALUE_INPUT ; unsigned short SECONDARY_VALUE_INPUT;.... for ( unsigned short i =0; i <sizeof (CURRENCY_PRIMARY_VALUES ) ; i ++){ i f (PRIMARY_VALUE_INPUT /CURRENCY_PRIMARY_VALUES[ i ]! = 0 ) { p r i n t f ( "%hd x %d \ n ",CURRENCY_PRIMARY_VALUES[ i ], PRIMARY_VALUE_INPUT /CURRENCY_PRIMARY_VALUES[ i ] ) ; PRIMARY_VALUE_INPUT =PRIMARY_VALUE_INPUT /CURRENCY_PRIMARY_VALUES[ i ] CURRENCY_PRIMARY_VALUES[ i ] ; for ( unsigned short i =0; i <sizeof (CURRENCY_SECONDARY_VALUES) ; i ++){ i f (SECONDARY_VALUE_INPUT/CURRENCY_SECONDARY_VALUES[ i ]! = 0 ) { p r i n t f ( "%hd x %d \ n ",CURRENCY_SECONDARY_VALUES[ i ], SECONDARY_VALUE_INPUT/CURRENCY_SECONDARY_VALUES[ i ] ) ; SECONDARY_VALUE_INPUT = SECONDARY_VALUE_INPUT/CURRENCY_SECONDARY_VALUES[ i ] CURRENCY_SECONDARY_VALUES[ i ] ; J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 6 / 12
Po zastosowaniu zasady DRY const unsigned short VALUES [ ] = {50000,20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1; const unsigned int NV = sizeof (VALUES ) / sizeof (VALUES [ 0 ] ) ;..... void convert ( unsigned i n t PVal, unsigned i n t SVal ) { unsigned short counter ; SVal+=PVal 100; i f ( SVal>=M_B) { p r i n t f ( " B i l l s : \ n " ) ; for ( u i n t 1 6 _ t i =0; i <NV; i ++) { counter = SVal /VALUES[ i ] ; i f (VALUES[ i ]==M_C) { p r i n t f ( " Coins : \ n " ) ; i f ( counter! = 0 ) { i f (VALUES[ i ] <100){ p r i n t f ( "%hu %s x %hu \ n ", VALUES[ i ], SVAL_NAME, counter ) ; else { p r i n t f ( "%d %s x %hu \ n ", VALUES[ i ] / 1 0 0, PVAL_NAME, counter ) ; SVal =counter VALUES[ i ] ; J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 7 / 12
Po przepuszczeniu przez program cpplint const unsigned i n t VALUES [ ] = {50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 ; const unsigned int NV = sizeof (VALUES) / sizeof (VALUES [ 0 ] ) ;.... void convert ( unsigned i n t PVal, unsigned i n t SVal ) { unsigned i n t counter ; SVal+= PVal 100; i f ( SVal >= M_B) { p r i n t f ( " B i l l s : \ n " ) ; for ( unsigned i n t i = 0; i < NV; i ++) { counter = SVal / VALUES[ i ] ; i f (VALUES[ i ] == M_C) { p r i n t f ( " Coins : \ n " ) ; i f ( counter!= 0) { i f (VALUES[ i ] < 100) { p r i n t f ( "%hu %s x %hu \ n ", VALUES[ i ], SVAL_NAME, counter ) ; else { p r i n t f ( "%d %s x %hu \ n ", VALUES[ i ] / 100, PVAL_NAME, counter ) ; SVal = counter VALUES[ i ] ; J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 8 / 12
Po zastosowaniu reguły KISS const i n t VALUES [ ] = {50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 ;.... void convert ( i n t PVal, i n t SVal ) { i n t counter ; SVal+= PVal 100; i f ( SVal >= M_B) { p r i n t f ( " B i l l s : \ n " ) ; for ( i n t i = 0; i < NV; i ++) { counter = SVal / VALUES[ i ] ; i f (VALUES[ i ] == M_C) { p r i n t f ( " Coins : \ n " ) ; i f ( counter!= 0) { i f (VALUES[ i ] < 100) { p r i n t f ( "%d %s %d \ n ", VALUES[ i ], SVAL_NAME, counter ) ; else { p r i n t f ( "%d %s %d \ n ", VALUES[ i ] / 100, PVAL_NAME, counter ) ; SVal = counter VALUES[ i ] ; J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 9 / 12
Po zastosowaniu Single Resposibility Principle void Zamien ( i n t gr, i n t rozmiar, const i n t NOMINALY [ ], i n t pieniadze [ ] ) { assert ( gr >= 0 ) ; for ( i n t i = 0; i < rozmiar ; ++ i ) { pieniadze [ i ] = gr / NOMINALY[ i ] ; gr = pieniadze [ i ] NOMINALY[ i ] ; i n t main ( ) { const i n t ILE_NOMINALOW = 15; const i n t NOMINALY[ILE_NOMINALOW] = { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 ; const i n t ZL_GR = 100; i n t zl ; i n t gr ; i n t banknoty [ILE_NOMINALOW ] ;.... Zamien ( zl ZL_GR + gr, ILE_NOMINALOW, NOMINALY, banknoty ) ;.... J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 10 / 12
Wnioski Metody polepszania umiejętności programistycznych Stosuj uniwersalne zasady programowania (KISS, DRY, SRP) Stosuj wspomagajace programowanie (np. cpplint, phplint, pylint) Stosuj, jeśli to możliwe, code analyzers Stosuj nowoczesne kompilatory (np. clang, cpplang) Korzystaj ze wszystkich możliwych opcji generowania ostrzeżeń przez kompilatory. J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 11 / 12
To już koniec Kontakt email: Jacek.Cichon@pwr.edu.pl WWW: https://www.cs.pwr.edu.pl/cichon/ Dziękuję J. Cichoń (KI WPPT PWr) O stylu programowania 30 listopada 2017 12 / 12