Направо към съдържанието

Качествен програмен код

от Уикипедия, свободната енциклопедия

Качественият програмен код е вътрешна и външна характеристика на приложния програмен код.

Външното качество на кода означава той коректно да изпълнява своята функция. Кодът трябва да произвежда правилни резултати и да работи бързо. Важно е той да е лесно използваем от крайния потребител и да е защитен. Качественият програмен код трябва да има и подходяща документация за крайния потребител.[1]

Вътрешното качество на кода означава той да може да се чете и разбира лесно. Програмният код трябва да е добре структуриран и наименуван. Целта е кодът да се редактира лесно и да се избегнат грешки.[2] Кодът може да съдържа вътрешни коментари, предназначени към други програмисти. Възприети са определени стандарти за писане на правилен програмен код, наречени код конвенции.

Пример за изходен код с лошо качество е следният цитат от C# програма:

  int value=010, i=5, w;
  switch(value){case 10:w=5;Console.WriteLine(w);break;case 9:i=0;break;
          case 8:Console.WriteLine("8 ");break;
     default:Console.WriteLine("def ");{
 Console.WriteLine("hoho ");	}
     for (int k = 0; k < i; k++, Console.WriteLine(k  'f'));break;} { Console.WriteLine("loop!"); }

Кодът от горния пример е труден за прочитане и разбиране. Имената на променливите "value, i, w" не носят никаква информация за тяхната роля. Лошото форматиране затруднява разбирането на логиката на програмата.

Следният отрязък е пример за качествен програмен код:

  string[] clientsNames = new string[]
  { "Xander David", "Boyle George", "Zoona Clarke", "Yvsen Stacy", "Applegate Steven" };
  Array.Sort(clientsNames);
  int clientsCount = clientsNames.Length;

  foreach (string client in clientsNames)
  {
      Console.Write(client + " ");
 }

Посочения код е лесен за четене и разбиране. Използвани са достатъчно точни и описващи имена като "clientNames, clientsCount". Te ясно описват ролята на променливите и масива в кода. Правилното форматиране спомага за лесното четене и разбиране на сорс кода.

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

Обикновено код конвенциите се разработват и поддържат от авторите на съответния език като се записват в един документ. Код конвенциите на Java например могат да се намерят на сайта на Oracle [3]. Насоките за писане на C# може да се намерят официалната MSDN Библиотека.

При други езици, като Ruby например[4], стандартите за употреба не са формализирани и се изготвят и допълват от обществото, което използва езика.

Именуване на идентификатори

[редактиране | редактиране на кода]

Идентификатори са имената на различни класове, анотации, променливи, изброими типове, интерфейси и др. Както в C#, така и в много други езици, имената на идентификаторите се избират от разработчика. Те не трябва да са случайни. Имената трябва да са съставени по такъв начин, че да носят полезна информация, за какво служат и каква точно роля изпълняват в съответния код. Така се улеснява четенето на кода. При именуване на различните идентификатори е хубаво да си задаваме различни въпроси като, какво прави този клас, каква е целта на променливата, за какво се ползва този метод и др.

Пример:

Добри имена са:

FactorialCalculator, studentsCount, Math.PI, configFileName, CreateReport

Лоши са:

k, k2, k3, junk, f33, KJJ, button1, variable, temp, tmp, temp_var, something, someValue

От принципите на обектно ориентираното програмиране следва, че всеки клас описва определен обект от реалния свят. Имената на класовете трябва да са съставени от съществително име (нарицателно или собствено), като може да има едно или няколко прилагателни (преди или след съществителното). Например класа описващ африканския слон, ще се казва AfricanElephant. Тази нотация на именуване се нарича PascalCase- първата буква на всяка дума от името е главна, а останалите малки. Така е по-лесно четенето и разбирането, а и придава смисленост на кода.

Смисленост на кода представлява кодиране, по начин, който е разбираем от всички. Ако „for” цикъл използва буквата „ I “ за индекс, това не е много смислено. Ако обаче се използва думата „ index “, това е далеч по смислено. Съдържанието(консистентност) е също толкова важно. Както при смислеността, съдържанието също може да се поясни с прост пример: ако различни думи са използвани за „ index”- “I”, “inx”, “indx”- това не е консистентно и смислено. Това е една от областите, в която се внася ненужно разсейване на самия код. Ако разбирасе „ index “ е използвано за същия случай, това прави кода по-бърз за четене и разбиране. Много е важно да сведем до минимум броя на непознатите и несмислените именувания и да увеличим броя на смислените и съдържателни такива.

Наред с именуването, форматирането е едно от основните изисквания за четим код. Без форматиране, каквито и правила да спазваме за имената и структурирането на кода, той няма да бъде лесен за четене и разбиране.

Това е много важно за четимостта. Основните принципи при форматиране са следните два: 1. Да се направи кода лесен за четене и поддръжка; 2. Подравняване и именуване по разбираем и смислен начин;

Водейки се по този принцип, един разработчик лесно може да прегледа кода и да разгледа моделите по най-бързия начин. Важно е не само за разбирането на самия код, но и за откриването на аномалии, както и като инструмент за рационализиране и консолидиране на кода. Код с много „разминавания“, не добре подреден и с много вариации и разтегнатост, е код, по който може да изгубите изключително много време.

Пример за свит код:

for(i=0;i<s;i++){a[i]=b[i];}

Правилния начин за представяне на кода е:

for(index = 0 ; index < size ; index++)
{
    arrayA[ index ] = arrayB[ index ] ;
}

Чистото форматиране и смисленото именуване, правят кода четим и лесен за разбиране.

Структура и преработка

[редактиране | редактиране на кода]

Добрата вътрешна структура на кода е важна за лесното разбиране и поддържане на софтуерния продукт. Кодът трябва да е разделен на отделни модули и подсистеми, според логиката на тяхната работа. Всяка част от кода, трябва да изпълнява ясно дефинирана задача.

Добрият софтуерен дизайн е с минимална сложност и е лесен за разбиране. Поддържа се лесно и промените се правят праволинейно. В повечето езици това означава съобразяване с принципите на обектно ориентираното програмиране.

  1. Въведение в програмирането със C#“, Светлин Наков, Веселин Колев и колектив, Изд. „Фабер“, Велико Търново, 2011 г., ISBN 978-954-400-527-6
  2. QualityCode.com Essay: What Is Code Quality?, архив на оригинала от 10 май 2013, https://web.archive.org/web/20130510073149/http://www.qualitycode.com/html/Essay8.html, посетен на 4 септември 2013 
  3. Code Conventions for the Java Programming Language
  4. Ruby Style Guidelines