You are on page 1of 26

Раздел V.

Работа с обекти
Итератори.Добри практики за писане
на код.
Итератори.Същност и класификация
 Дефиниция:Итераторите са обобщение на указателите:
-Те са обекти, които сочат други обекти;
-Итераторите позволяват да преминават елементи;
-В определен момент итераторът сочи един обект от контейнера, в следващият момент
следващият и т.н.
-Позволяват на програмиста да работи по еднакъв начин с различни обекти, съхранени в
контейнери.
 Предназначение:Итераторите са елемент на обобщеното програмиране и обобщените
алгоритми
-Като аргументи на обобщените алгоритми;
-Итераторите определят начина, по който ще се осъществи достъпът до обектите в
контейнера;
-Обобщение на указателите
Шаблони в проектирането (Design Patterns)
 Общовалидни повторяеми решения на обичайни проблеми в софтуерния дизайн
 Предоставят тествани и доказани в разработката модели
 Подпомагат четливостта на кода за разработчици, вече запознати с тези
шаблони

4
IEnumerable<T>
 Основенинтерфейс в .NET, позволяващ просто обхождане на
колекция
 Съдържаедин-единствен метод GetEnumerator(), който
връща един IEnumerator<T>
 Клас,
реализиращ IEnumerable<T> може да бъде използван за
обхождане с цикъла foreach
 Енумераторът представлява итератор. Енумераторите се
използват чрез извикване на метода GetEnumerator() на обект
който имплементира IEnumerable интерфейс.

5
IEnumerator<T>

Предоставя последователно, еднопосочно обхождане на колекция от произволен тип
 Методи
 MoveNext() – премества итератора към следващия елемент в колекцията.
 Reset() – връща итератора на началната му позиция
 Свойства
 Current – връща елемента от колекцията, който е на текущата позиция на
итератора
 Пример: IEnumerator<MyType> iter = list.GetEnumerator();
while (iter.MoveNext())
{

Console.WriteLine(iter.Current);
}
6
Yield Return
 Указва, че методът, в който се появява, е итератор
 Опростява реализацията на IEnumerator<T>
 Връща един елемент за всяко повторение на цикъла
 .NET 2.0 Framework позволява на C# да представи итератор
който има функционалността на генератор чрез конструкцията
yield return.

7
Params
 Приема променлив брой параметри
 Само една params команда е допустима в декларацията на метод
 Трябва винаги да е последна

8
 Итератори
 IEnumerable<T> интерфейса позволява просто обхождане на колекция с
цикъл foreach
 IEnumerator<T> интерфейсa предоставя методите за обхождане на
колекцията
 yield return връща отделния елемент от колекцията
 Params приема променлив брой параметри

9
Именуване на идентификаторите
 Идентификатори са имената на класове, интерфейси, изброими типове,
анотации, методи и променливи. В C# и в много други езици имената на
идентификаторите се избират от разработчика. Имената не трябва да
бъдат случайни. Те трябва да са съставени така, че да носят полезна
информация за какво служат и каква точно роля изпълняват в съответния
код. Така кодът става по-лесно четим.
 Когато именуваме идентификатори е добре да си задаваме въпроси:
Какво прави този клас? Каква е целта на тази променлива? За какво се
използва този метод?
Именуване на идентификаторите
 Добри имена са: FactorialCalculator, studentsCount, Math.PI,
configFileName, CreateReport
 Лоши имена са: k, k2, k3, junk, f33, KJJ, button1, variable, temp, tmp,
temp_var, something, someValue
 Изключително лошо име на клас или метод е Problem12. Някои
начинаещи програ­мисти дават такова име за решението на задача 12 от
упражненията. Това е изключително грешно! Какво ще ви говори името
Problem12 след 1 седмица или след 1 месец? Ако задачата търси път в
лабиринт, дайте име PathInLabyrinth. След 3 месеца може да имате
подобна задача и да трябва да намерите задачата за лабиринта. Как ще я
намерите, ако не сте й дали подходящо име? Не давайте име, което
съдържа числа – това е индикация за лошо именуване.
Избягвайте съкращения

 Съкращения трябва се избягват, защото могат да бъдат объркващи.


 Например за какво ви говори името на клас GrBxPnl? Не е ли по-ясно, ако
името е GroupBoxPanel? Изключения се правят за акроними, които са по-
попу­лярни от пълната си форма, например HTML. Например името
HTMLParser е препоръчително пред HyperTextMarkupLanguageParser.
Използване на английски език

 Едно от най-основните правила е, винаги да се използва английски език.


Помислете само ако някой виетнамец използва виетнамски език, за да си
кръщава променливите и методите. Какво ще разберете, ако четете
неговия код? Ами какво ще разбере виетнамецът, ако вие сте ползвали
български и след това се наложи той да допише вашия код. Единственият
език, който всички програмисти владеят, е английският.
 Винаги използвайте английски език за имената на идентификаторите в
сорс кода (променливи, методи, класове и т.н.). Използвайте
английски и за коментарите в програмата.
Подбиране на подходящи
идентификатори в различни случаи.
 Последователност при именуването-
 Начинът на именуване трябва да е последователен.
 В групата методи LoadFile(), LoadImageFromFile(), LoadSettings(),
LoadFont(), LoadLibrary() е неправилно да се включи и ReadTextFile().
 Противоположните дейности трябва да симетрично именувани (тоест,
когато знаете как е именувана една дейност, да можете да предположите
как е именувана противоположната дейност): LoadLibrary() и
UnloadLibrary(), но не и FreeHandle(). Също и OpenFile() с CloseFile(), но
не и DeallocateResource(). Към двойката GetName, SetName е
неестествено да се добави AssignName.
Имена на класове, интерфейси и други типове

 Класовете описват обекти от реалния свят. Имената на класовете трябва да са съставени


от съществително име, като може да има едно или няколко прилагателни (преди или след
същест­вителното). Например класът описващ Африканския лъв ще се казва AfricanLion.
Тази нотация на именуване се нарича Pascal Case – първата буква на всяка дума от името е
главна, а останалите са малки. Така по-лесно се чете.
 Да дадем още няколко примера. Трябва да напишем клас, който намира прости числа в
даден интервал. Добро име за този клас е PrimeNumbers или PrimeNumbersFinder или
PrimeNumbersScanner. Лоши имена биха могли да бъдат FindPrimeNumber (не трябва да
ползваме глагол за име на клас) или Numbers (не става ясно какви числа и какво ги
правим) или Prime (не трябва името на клас да е прилагателно).
Колко да са дълги имената на класовете?

 Имената на класовете не трябва да надвишават в общия случай 20


символа, но понякога това правило не се спазва, защото се налага да се
опише обект от реалността, който се състои от няколко дълги думи.Ако
може едно име да е по-кратко и също толкова ясно, колкото дадено по-
дълго име, предпочитайте по-краткото.
 Лош съвет би бил да се съкращава, за да се поддържат имената кратки.
Следните имена достатъчно ясни ли са: CustSuppNotifSrvc, FNFException?
Очевидно не са. Доста по-ясни са FileNotFoundException,
CustomerSupportNotificationService, въпреки че са по-дълги.
Имена на интерфейси и други типове
 Имената на интерфейсите трябва да следват същата конвенция, както имената на
класовете: изписват се в Pascal Case и се състоят от съществително и евентуално
прилагателни. За да се различават от останалите типове, конвенцията повелява
да се сложи префикс I.
 Примери са IEnumerable, IFormattable, IDataReader, IList, IHttpModule,
ICommandExecutor.
 Лоши примери са: List, FindUsers, IFast, IMemoryOptimize, Optimizer,
FastFindInDatabase, CheckBox.
 В .NET има още една нотация за имена интерфейси: да завършват на "able":
Runnable. Това са интер­фейси, които най-често добавят допълнителна роля към
основната роля на един обект. Повечето интерфейси обаче не следват тази
нотация, например интерфейсите IList и ICollection.
Имена на изброимите типове (enumerations)

 Няколко формата са допустими: [Съществително] или [Глагол] или


[Прилагателно]. Имената им са в единствено или множествено число. За
всички членове на изброимите типове трябва да се спазва един и същ
стил.
 enum Days
 {
 Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
 };
Имена на атрибути

 Имената на атрибутите трябва да имат окончание Attribute. Например


WebServiceAttribute.
Имена на изключения

 Код конвенцията повелява изключенията да завършват на Exception.


Името трябва да е достатъчно информативно. Добър пример би бил
FileNotFoundException. Лош би бил FileNotFoundError.
Имена на делегати

 Делегатите трябва да имат суфикс Delegate или EventHandler.


DownloadFinishedDelegate би бил добър пример, докато
WakeUpNotification не би спазвал конвенцията.
Имена на свойства

 Имената на свойствата са нещо средно между имената на методите и на


променливите – започват с главна буква (PascalCase), но нямат глагол
(като променливите). Името им се състои от (прилагателно+) съществи­
телно.
 Ако имаме свойство X е недобра практика да имаме и метод GetX() – ще
бъде объркващо.
 Ако свойството е енумерация, можете да се замислите дали да не
кръстите свойството на самата енумерация. Например ако имаме
енумерация с име CacheLevel, то и свойството може да се кръсти
CacheLevel.
Имена на променливи
 Имената на променливите (променливи използвани в метод) и член-променливите (променливи използвани в клас)
според Microsoft конвенцията трябва да спазват camelCase нотацията.
 Променливите трябва да имат добро име като всички други елементи на кода. Добро име е такова, което ясно и точно
описва обекта, който променливата съдържа. Например добри имена на променливи са account, blockSize и
customerDiscount. Лоши имена са: r18pq, __hip, rcfd, val1, val2.
 Името трябва да адресира проблема, който решава променливата. Тя трябва да отговаря на въпроса "какво", а не "как". В
този смисъл добри имена са employeeSalary, employees. Лоши имена са, несвързаните с решавания проблем имена
myArray, customerFile, customerHashTable.
 Оптималната дължина на името на променлива е от 10 до 16 символа. Изборът на дължината на името зависи от обхвата –
променливите с по-голям обхват и по-дълъг живот имат по-дълго и описателно име: protected Account[]
customerAccounts;
 Променливите с малък обхват и кратък живот могат да са по-кратки:
for (int i=0; i < customers.Length; i++) { … }

 Имената на променливите трябва да са разбираеми без предварителна подготовка. Поради тази причина не е добра идея
да се премахват гласните от името на променливата с цел съкращение – btnDfltSvRzlts не е много разбираемо име.
 Най-важното е, че каквито и правила да бъдат изградени за именуване на променливите, те трябва да бъдат
консистентно прилагани навсякъде из кода, в рамките на всички модули на целия проект и от всички членове на екипа.
Неконсистентно прилаганото правило е по-опасно от липсата на правило въобще.
Оператори
 Операторите позволяват обработка на примитивни типове данни и обекти.
Те приемат един или няколко операнда и връщат някаква стойност.
Оператори
Използване на оператори:

You might also like