Добър стил на писане

4 views
Skip to first unread message

TriEdgeAI

unread,
Dec 18, 2011, 9:23:05 AM12/18/11
to ТУЕС Програмно осигуряване 2011
Ще пусна отдолу късо парче код, бих искал ако може някой да посочи
къде има прояви на "лош стил" и т.н. и как да се поправи. Ето как
подреждам:

http://triedgeai.hit.bg/pseudo.png

Lubomir Tzvetkov

unread,
Dec 18, 2011, 3:59:45 PM12/18/11
to cprogrammi...@googlegroups.com
Здравей,
Така бързо като погледнах видях тези места като носители на лош стил.

#include <stdio.h>

//функциите директно с тялото отгоре (без прототипи)
int func()
{
       //bla bla bla
}
// Принципно е хубаво да си декларираш всички функции отгоре и след това да ги инициализираш. Друго което можеш да направиш е да ги изнесеш в отделни файлове със съответстващите им хедър файлове.

int main()
{
       char a = 'x';
       char b;
       int i;

// Не е хубаво да оставяш неинициализирани променливи. Друго можеш да им зададеш по значещи имена от просто a, b, i. Хубаво е да създаваш променливата точно когато ще я използваш.

       printf("Hi %c", a);
       b = getchar();
// Разделяй презентационната логика от така наречена бизнес(същинска логика) в отделни функции. Не трябва да имаш логика в main функцията освен извикване на други функции.
       if(b == 'z')
       {
               bla_bla;
               more_bla_bla;

               for(i=0; i<10; i++)
               {
                       trololo;
               }
       }

// Да си кажа все пак trololo, something и др. Такива наименования ТВЪРДО НЕ. Функция е действие най-често се пише с глагол(run, print, makeCoffee и др), докато променливите са носители на черти, състояние и се описват със съществително или прилагателно(isRunning, mass, height, width и др.)

       if(something)
               single_statement;

       if(something)
           for(i=10; --i;  )
                       while(...)
                               single_statement;
       // Много if-ове или вложени цикли не е на добре. Трябва да търсиш еквиваленто представяне с функции(да направиш по-стъпков и логически целенасочен код. Идеята е да не се получава така наречения "спагети код" или дадена функция да прави всичко - да чисти, да пере, да глади, да прави кафе и тн....)
       //това в много редки случаи
       while(!bla)
               do_something(), b = getchar();
       // Винаги слагай отваряща и затваряща скоба дори да е един ред, защото като е изморен човек лесно не вижда такива неща и може доста часове да прекара в глупости.
       //без тяло понякога
       while(str[i++]);
       //ТВЪРДО НЕ - един ред прави едно нещо не 10 неща. Компютрите са достатъчно бързи за да се пести от четимост на кода. Кодът трябва да е максимално четим, последователен и разбираем не само за пишещия и за останалите.
       return 0;
}

Поздрави, Любо.

TriEdgeAI

unread,
Dec 18, 2011, 8:35:24 PM12/18/11
to ТУЕС Програмно осигуряване 2011
Много благодаря за изчерпателния отговор!

С именуването и разпределянето по функции съм наред (предполагам),
тука съм ги напраскал така имената, понеже нямаше никакъв конкретен
смисъл, просто да се вижда къде има табулации, нови редове, скоби и
пр. Смисъл мен питането ми беше само за подреждането, не съм се
изразил правилно :)

В крайна сметка кофтито е изпускането на { }, претрупването на
операции на един ред и липсата на прототипи на функциите?

Колкото до хедърите, попринцип гледам, че всички ги разделят на .h
и .c, само че аз имам навика всичко да блъскам в .h файла и да нямам
отделен .c файл. Това кофти ли е също, защото на мен лично ми се
струва много по-удобно? Най-вече, че като правя промени в
декларациите, няма нужда да ги правя на две места.

Lubomir Tzvetkov

unread,
Dec 19, 2011, 4:53:11 AM12/19/11
to cprogrammi...@googlegroups.com
Здравей,

Прочети от 1.7 до 1.9. Това е за C++, но идеята е същата.

Колкото до хедърите, попринцип гледам, че всички ги разделят на .h
и .c, само че аз имам навика всичко да блъскам в .h файла и да нямам
отделен .c файл. Това кофти ли е също, защото на мен лично ми се
струва много по-удобно? Най-вече, че като правя промени в
декларациите, няма нужда да ги правя на две места.

// Да удобно е, но помисли че имаш вече един файл с готова функционалност (по-точно твой си функции). Ако си разделил на хедър и .c файл, то ти може да компилираш .c файла (тялото на функциите - самата имплементация) и когато го използваш в дадена програма да не се налага постоянно да го компилираш и него. Тогава хедъра ти се явява като чист интерфейс, който ти казва какво има в съответсващата компилирана библиотека ( най-често с разширение .dll и .so). Така са реализирани библиотеките, които си добавял досега (stdio.h, math.h и т.н.). По такъв-начин лесно може да се подменя имплементацията, без това да влияе на направена досега програма, тъй като ти в нея си използвал само интерфейса. Може да се скрива код от потребителя ( да се прави частен и т.н.). Прочети повече от линка горе и ще ти стане по-ясно.

Поздрави, Любо.
Reply all
Reply to author
Forward
0 new messages