Styl programowania. komentowanie programów nazywanie zmiennych, typów i funkcji rozmieszczenie tekstu w plikach źródłowych. M. Kotowski.

Podobne dokumenty
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Podstawy programowania w języku C i C++

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Microsoft IT Academy kurs programowania

1 Podstawy c++ w pigułce.

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

1 Podstawy c++ w pigułce.

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania skrót z wykładów:

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Podstawy Programowania C++

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Języki programowania - podstawy

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie strukturalne i obiektowe

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

MATERIAŁY DO ZAJĘĆ II

Podstawy programowania w języku C

Programowanie w języku Python. Grażyna Koba

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Podstawy programowania w języku C++

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Języki i metodyka programowania. Wprowadzenie do języka C

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Język ludzki kod maszynowy

Wstęp do programowania

Wst p do C i typy danych

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wstęp do Programowania, laboratorium 02

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Wskaźniki. Informatyka

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Część 4 życie programu

Struktury, unie, formatowanie, wskaźniki

Podstawowe części projektu w Javie

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Funkcja (podprogram) void

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

I - Microsoft Visual Studio C++

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

tablica: dane_liczbowe

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Tablice deklaracja, reprezentacja wewnętrzna

Podstawy Programowania Podstawowa składnia języka C++

Zmienne, stałe i operatory

Wprowadzenie do języka Java

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Wstęp do informatyki- wykład 9 Funkcje

Podstawy Programowania

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

LibreOffice Calc VBA

2 Przygotował: mgr inż. Maciej Lasota

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wstęp do programowania. Różne różności

lekcja 8a Gry komputerowe MasterMind

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Umieszczanie kodu. kod skryptu

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Języki i techniki programowania Ćwiczenia 2

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Mikrokontroler ATmega32. Język symboliczny

Języki programowania obiektowego Nieobiektowe elementy języka C++

Oczywiście plik musi mieć rozszerzenie *.php

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

ZMIENNE. Podstawy PHP

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Wstęp do informatyki- wykład 11 Funkcje

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Programowanie obiektowe

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Programowanie komputerowe. Zajęcia 4

Transkrypt:

Styl programowania komentowanie programów nazywanie zmiennych, typów i funkcji rozmieszczenie tekstu w plikach źródłowych M. Kotowski. Wysokie C

Program w C powinien być: czytelny łatwy do testowania i usuwania błędów poprawny i niezawodny łatwy do modyfikowania i rozszerzania przenośny defensywny spójny stylistycznie efektywny uniwersalny DEFENSYWNY: umiejący sobie radzić z błędami (brak pamięci, złe dane, brak pliku, )

IOCCC The International Obfuscated C Code Contest W roku 1984 Wielką Nagrodę zdobył Sjoerd Mullender (Holandia) za następujący program: short main[] = 277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800, -113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004, 14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9, 4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419, 0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0, 4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#', 0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712, 'p', 072163, 'r', 29303, 29801, 'e' ; http://www.ioccc.org/

Proste przykłady: if (Counter) if (!Valid) ZALECANE if (St & BIT_A) if (Counter!= 0) ZALECANE if (Valid == 0) if (St & BIT_A!= 0) BŁĘDNE

if (Counter!= 0) State = 1; else State = 0; ZALECANE State = (Counter? 1 : 0); State =!!Counter; State = (Counter!=0 ); nie ma jednego najlepszego stylu programowania należy wybrać sobie jeden z proponowanych stylów i konsekwentnie go stosować

Język C po angielsku czy po polsku? Konsekwentnie: albo po polsku albo po angielsku. Unikać jednoczesnego używania np. zmiennych Licznik i Counter, funkcji GetData i WczytajPlik, czy nawet ReadPlik. Przykład: if (!find_przyst(przyst_name)) insert_przyst(przyst_name); Tak mi się napisało. Mogę po polsku i po angielsku Można przyjąć zasadę jaką wybrał tłumacz książki K&R: zmienne po angielsku, komentarze po polsku.

Komentowanie programów Przykład samokomentującej się funkcji: COLUMN IncrementColumn(COLUMN Column) return (Column < MAX_COLUMN? Column+1 : 0); Przykład samokomentującego się kodu: while (GetNextEmployee(EmplPtr)!= 0) Ale nie wiadomo po co robiona jest ta pętla oraz komentarza może wymagać jej wnętrze.

Nagłówki komentarzowe funkcji nazwa funkcji krótki opis operacji realizowanych przez funkcję lista argumentów funkcji oraz ich opis lista zmiennych zewnętrznych, z których korzysta funkcja lista zmiennych zewnętrznych modyfikowanych przez funkcję; opis wartości zwracanej (ewentualnie informacje o błędach wykonania)

/*------------------------------------------------- SearchInString FUNKCJA ZNAJDUJE W CIĄGU LICZBĘ WYSTĄPIEŃ CIĄGÓW SPEŁNIAJĄCYCH WZÓR WYSZUKIWANIA ARGUMENTY: Text - ADRES CIĄGU PRZESZUKIWANEGO Image - ADRES WZORU WYSZUKIWANIA (DOPUSZCZA ZNAKI * i?) Status - PARAMETR PRZESZUKIWANIA - W_PRZOD, W_TYL - LITERY_WIELKIE, LITERY_MALE - CALE_WYRAZY (ZDEFINIOWANE W SEARCH.H) WARTOŚĆ ZWRACANA: LICZBA ZNALEZIONYCH WYSTĄPIEŃ -------------------------------------------------*/ int SearchInString (const char *Text, const char *Image, int Status)

Komentarze w kodzie Komentarz blokowy: /* OBLICZANIE ILU PRACOWNIKÓW W ZBIORZE MA GRUPĘ A */ while (GetNextEmployee(EmplPtr)!= 0) Komentarz w linii: TotalLines=LinesCounter+StartLines+EndLines; /* ŁĄCZNA LICZBA LINII TEKSTU NA STRONIE */ W osobnym wierszu, jeśli się nie mieści, ale z dużym wcięciem.

Komentarz w linii nie powinien powtarzać tego co opisano w kodzie: Counter++; /* ZWIEKSZENIE ZMIENNEJ Counter O 1 */ Lepiej: Counter++; /* UAKTUALNIENIE LICZBY ZLICZANYCH DOKUMENTÓW */ Przy złożonych instrukcjach dobrze komentować nawiasy klamrowe: while (GetNextEmployee()!= 0) if (EmployeeNumber!= 0) /* if (EmployeeNumber!= 0) */ /* while (GetNextEmployee()!= 0) */

Komentowanie definicji zmiennych Zaleca się komentowanie struktur i unii w komentarzu blokowym nad nimi. Komentarze jako szkielety funkcji PARAGRAPH *AllocatePar(char *Text) /* ALOKACJA PAMIĘCI NA STRUKTURĘ PARAGRAPH */ /* ALOKACJA PAMIĘCI NA TEKST */ /* SKOPIOWANIE TEKSTU DO STRUKTURY I POWRÓT */ Funkcja zostanie napisana później ale już zawczasu opisano co będzie robić krok po kroku.

Nazywanie zmiennych, typów i funkcji nazwy zmiennych i funkcji powinny odzwierciedlać ich sens nazwy o pokrywającym się zasięgu powinny różnić się w sposób istotny np. Source i Dist zamiast String1 i String2 nazwy nie powinny wyglądać podobnie np. LastWord i LostWord counter i Counter WordCounter i Word_counter Index i Indeks

nie tworzyć nazw trudnych do wymówienia np. zamiast Flnm lepiej FileName zamiast WrkrIndx lepiej WorkerIndex WRZWSZ - propozycja instrukcji w LOGO nazwy nie powinny być przegadane zamiast Ptr_To_Employee_Code lepiej PtrEmployeeCode lub PtrCode zamiast EmployeeArray[EmployeeIndex] -> EmployeeStatus lepiej Empl[Index] -> Status

zmienne o podobnym lub identycznym charakterze powinny mieć podobne lub identyczne nazwy np. funkcje realizujące podobne operacje na identycznych argumentach powinny mieć parametry identycznie nazwane i w tej samej kolejności, jeśli zmienne lokalne w różnych funkcjach przechowują te same dane, to powinny nazywać się identycznie np. EmplPtr a nie w jednej EmplPtr, w innej Ptr_To_Empl a jeszcze w innej TempPtr im szerszy zasięg zmiennej tym dłuższa nazwa

nazwy jednoliterowe tylko dla zmiennych lokalnych o małym zasięgu stosuje się zasady: c - typ char i, j, k - typ int p, q, r - wskaźniki s, t - napisy (wskazania na znak) x, y - całkowite do przechowywania wsp. kartezjańskich unikać: char i; long c;

różne obiekty powinny mieć różne nazwy np. poprawne ale w złym stylu: struct Name int Name; struct Name Name; k=name.name;

Tworzenie skrótów ClearArray - ClrArr InitiateEmployeeStructure - InitEmplStruc IncrementColumn - IncrCol Przykłady standardowych funkcji: strcpy - string copy strlen - string length strcmpi - string compare ignoring case memset - memory set stdio - standard input-output stddef - standard definitions stdlib - standard library

Notacja węgierska Nazwa od narodowości jej autora Charlesa Simonyi (twórcy Word i Excel) z firmy Microsoft. Zasada: na początku nazwy zmiennej umieścić informację o jej typie. Przedrostki i podstawowe typy: a - tablica (array) b - wartość logiczna (bool) c - znak (character) f - znacznik bitowy (flag) h - numer pliku (handle) i - liczba całkowita (integer) l - liczba całkowita długa (long) p - wskaźnik (pointer) s - struktura (structure) u - liczba bez znaku (unsigned) z - ciąg znaków zakończony zerem

Standardowe nazwy własne: Temp - zmienna tymczasowa Sav - zmienna, w której przechowuje się pewną wartość a później odtwarza Prev - wartość przechowana, pochodząca z poprzedniej iteracji Cur - wartość bieżąca Next - wartość następna w pewnej iteracji Nazwy funkcji (zaczynają się z wielkiej litery): [Typ][Operacja][Argumenty] PnInsertObj(pObj) p - wskaźnik n - node (wierzchołek) Insert - wstawianie Obj - obiekt (nie jest precyzyjne bo to wskazanie na obiekt a nie on sam!)

Rachunek typów : s - struktura b - wartość logiczna bshift = psemp -> bworking jest poprawne bo psemp jest wskazaniem na strukturę jest poprawne bo po obu stronach są wartości logiczne

Ocena notacji węgierskiej ZA kontrola rachunku PRZECIW zmniejsza poziom abstrakcji dziwne nazwy utrudnia modyfikację typów programu (czasami bywa to sprawdza się w dużych zaletą) projektach więcej przeciwników niż zwolenników

Definiowanie stałych if (Counter < 64) nic nie mówi #define PAGE_LENGTH 64 if (Counter < PAGE_LENGTH) wszystko wyjaśnia Number=fread(Buffer, 20, 30, Fp); czy to przeczytanie 20 rekordów po 30 bajtów, czy 30 rekordów po 20 bajtów? #define RECORD_LENGTH 20 #define NO_RECORDS 30 Number=fread(Buffer, RECORD_LENGTH, NO_RECORDS, Fp); nie tylko czytelność programu ale i łatwość modyfikowania

Wyjątki: stałe 0, 1, -1 należy pozostawiać zapisane explicite Stałe szesnastkowe: 0xA230 lepiej niż 0XA230 albo 0xa230. Stałe będące liczbami zmiennoprzecinkowymi lepiej zapisać np. 23.0F niż jako całkowita z rzutowaniem (float)23

/* NUMERY KLAWISZY FUNKCYJNYCH */ #define #define #define #define F1 F2 F3 F4 (256+59) (256+60) (256+61) (256+62) /* POLECENIA MENU */ #define #define #define #define HELP F1 LOAD_FILE F2 INSERT F3 DELETE F4 switch (PressedKey) case DELETE: case HELP:

Układ kodu (layout, wcięcia) K&R if (x > y) Allman if (x > y) Eric Allman twórca sendmail z Kalifornijskiego Uniwersytetu w Berkeley. Wyjątek w stylu Allmana w przypadku do-while: do do while (Function(x, y)); zalecany while (Function(x, y));

K&R oraz Allman stosuje się również przy zapisie funkcji i struktur. Różne wariacje (za C/C++ Users Journal i Microsoft Systems Journal): if (Expr1) Expr2; Expr3; if (Expr1) Expr2; Expr3; if (Expr1) Expr2; Expr3; Zalecenie: lepiej klamry w jednej linii. if (x > 0) Func(x); if (x > 0) Func(x); Nawiasy są zbędne ale mogą się przydać podczas rozszerzania bloku w instrukcji if.

Wcięcia nie wcina się deklaracji i definicji zewnętrznych wcina się treść funkcji i zagnieżdżenia bloków (for, if, do, while, switch) najlepiej dla wcięć przyjąć pozycję 2, 4 albo 8 Różne kształty wcięcia: while (Expr) x=y; while (Expr) x=y; while (Expr) x=y; za głęboko Koniec bloków: zalecane

Instrukcja if-else: if (Expr1) else if (Expr2) else if (Expr3) else if (Expr1) else if (Expr2) else if (Expr3) else