Garey

Code Quality

Aug 1st, 2020
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.79 KB | None | 0 0
  1. Жени, помислих над това, дето си лафихме предният път относно качеството на писането на код ии реших да си го напиша в
  2. един файл, така че да мога да ти го пратя тия дни и да го прочетеш. Приготвяй се, стабилен спам иде :D
  3.  
  4. Качествен код или добър код...Честно казано качеството на кода е директно свързано с поддръжката на продукта, който се
  5. разработва, докато продуктивността на програмирането на кода е нарастваща спрямо времето. Докато някакви нови неща се
  6. добавят и промени се правят, времето си минава и първият разработчик минава на друг проект или забравя някои детайли
  7. за даденият проект, или качеството на кода ако не е добро, промените стават доста рисковани и трудни.
  8.  
  9. Като цяло смятам, че програмистите са си наистина автори или творци като целевата група не е компютъра, а други програмисти.
  10. Това включва и самите нас като такива. Времето, което аз лично отделям да чета код, сравнено с това да го пиша е най-малко в 10 към 1 отношение.
  11. Постоянно чета стар код, за да мога да създам нов код. Писането на изчистен код е по-лесно за разбиране и по-бързо вникване в проекта,
  12. и е съществено за създаването на успешен и лесен за поддръжка продукт.
  13.  
  14. Има един лаф на Martin Golding: "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." :D :D
  15. Та, да де, идеята ми е, че трябва да се стремим да пишем такъв "изчистен" код, но това ти е ясно. Програмирането, честно казано, малко ми наподобява един
  16. физичен закон, по-точно вторият закон на термодинамиката, а той гласи: "Безпорядъчността на една затворена система, която не се намира в равновесие нарастваща
  17. с времето, като достига максималната си стойност при достигане на равновесие".
  18.  
  19. С други думи, отнема адски много труд, за да пишеш "чист" код. Трябва доста концентрация и много практика зад гърба на човека, за да се извърши това по време
  20. на процеса. Аз лично, за да си доизпипам нещата по кода, трябваше да се отуча от навици, които ме бяха научили на разни места като училище и от четенето на
  21. лоши примери, от които съм научавал различни програмни езици.
  22.  
  23. Честно казано, за толкова опит през годините и за тоя целият текст, който е по-горе, смятам че качественият код е до четимост. Така, че дори и малки промени
  24. като това да смениш начина или навиците си за именуване на променливи прави доста голяма промяна, когато след време се върнеш на този код или някой друг
  25. го гледа.
  26.  
  27. Ето няколко прости примера, които се сещам в момента:
  28.  
  29. 1. Имена на променливи и методи. Също така namespace-овете са доста по-четливи, отколкото това m_, което е за member.
  30. Кофти код:
  31. class Example {
  32. private:
  33. std::string m_dsc;
  34. std::string get();
  35. }
  36.  
  37. Добър код:
  38. class Example {
  39. private:
  40. std::string description;
  41. std::string getDescription();
  42. }
  43.  
  44. 2. Използвай имена, които са лесни за казване.
  45.  
  46. Кофти код:
  47. auto genymdhms = time(NULL);
  48. auto modymdhms = time(NULL);
  49.  
  50. Добър код:
  51. auto generationTimestamp = time(NULL);
  52. auto modificationTimestamp = time(NULL);
  53.  
  54. 3. Може би, най-важната част, бъди постоянна в именоването. Не използвай двете, за да извършваш едно и също нещо в различни класове.
  55.  
  56. Пример:
  57. class HTTPRequest {
  58. public:
  59. virtual auto get() -> std::string = 0;
  60. }
  61.  
  62. class HTTP2Request {
  63. public:
  64. virtual auto fetch() -> std::string = 0; // Прави същото като горният пример
  65. }
  66.  
  67. 4. Използвай терминология. Другите програмисти мисля, че ги знаят, ако не, за тях си е.
  68.  
  69. Пример:
  70. По-добре е да е requestQueue, отколкото requests, като име на променлива.
  71.  
  72. 5. Използвай действията на променливата, за да дефинираш метод. Разбира се, ако идват много дълги, просто разбиваш на подметоди.
  73.  
  74. Пример:
  75.  
  76. class Product {
  77. private:
  78. double price;
  79.  
  80. public:
  81. inline auto increasePrice(double amountToAddToPrice) -> void {
  82. this->price += amountToAddToPrice;
  83. }
  84. }
  85.  
  86. 6. Фунцкиите. Тук ще посъкратя малко
  87. - Колкото по-малка е една функция, толкова по-добре
  88. - Функцията трябва да прави само едно нещо
  89. - Колкото по-малко аргументи, толкова по-добре. Повече от три аргумента, вече става too much.
  90.  
  91. Пример:
  92.  
  93. Кофти код:
  94. Circle makeCircle(double x, double y, double radius)
  95.  
  96. Добър код:
  97. Circle makeCircle(Point center, double radius)
  98.  
  99. - Без странични неща. Функциите трябва да правят това, което името им казва.
  100. - Избягвай изхода, освен ако не е return на фунцкията. Ако един return не ти стига, значи функцията не прави едно единствено нещо.
  101.  
  102. Пример:
  103.  
  104. Кофти код:
  105. addSignature(email);
  106.  
  107. Добър код:
  108. email.addSignature()
  109.  
  110. - Error handling-а най-добре да става чрез exception-и. По-добре да се връщат exception-и и да се прихващат чрез try/catch, отколкото return code-ове.
  111.  
  112. 7. Коментари
  113. - Не коментирай кофти код, просто го пренапиши.
  114. - Ако кодът е четим, не са ти нужни изобщо коментари.
  115.  
  116. Пример:
  117.  
  118. Кофти код:
  119. // Check to see if the student is eligible for benefits
  120. if(student->flags && ELIGIBILITY_FLAGS::HOURLY_FLAG && student->age > 20)
  121.  
  122. Добър код:
  123. if(student->isEligibleForBenefits())
  124.  
  125. - Ако ти се налага да коментираш, направи го така, че да изразиш какво си искала да направиш или предупреди хората
  126. Пример:
  127. // if we sort the array here, the logic becomes simpler in calculateAge() method
  128. // this operation may take a very long time to run
  129. - Използвай коментари, от които може да бъде изведена документация. Например doxygen. Други коментари би било добре да се избягват.
  130. Пример:
  131. /**
  132. * Sum numbers in a vector.
  133. *
  134. * This sum is the arithmetic sum, not some other kind of sum that only
  135. * mathematicians have heard of.
  136. *
  137. * @param values Container whose values are summed.
  138. * @return sum of `values`, or 0.0 if `values` is empty.
  139. */
  140. double sum(std::vector<double> & const values) {
  141. ...
  142. }
  143.  
  144. Като цяло, това е което исках да споделя като опит. Други неща, за които можеш да се оглеждаш и да разбереш, че не са като хората са неща като:
  145. - Големи класове
  146. - Един главен обект и много дъщерни
  147. - Многоезичност в един файл
  148. - Прекалено използване на static
  149. - Hardcode-ване
  150. - Прекалено много наследявания
  151. - Последователно свързване - Когато един клас изисква методите си да бъдат извикани в дадена последователност.
  152. - Затворени цикли от референции и/или изисквания на библиотеки/класове/разни други неща.
  153.  
  154. Абе, трудничко си е, но определено си струва всяка една секунда от този труд, който полагаш. Хората след теб ще ти се кланят, защото си оставила
  155. чист и подреден код, който те разбират с лекота. Пък и, както казах в началото на спама, доста съществена част е в успеха на проекта.
  156.  
  157. Извинявай за спама, няма проблем ако не си съгласна с нещата, които съм написал. Даже, ако искаш можем да ги обсъдим, хаха. Поздрави
Add Comment
Please, Sign In to add comment