SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
СОВРЕМЕННЫЕ
ПОДХОДЫ К РАЗРАБОТКЕ
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ ИМЕНИ В. Н. КАРАЗИНА
ФАКУЛЬТЕТ КОМПЬЮТЕРНЫХ НАУК
КАФ. ИСКУССТВЕННОГО ИНТЕЛЛЕКТА И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
К.Ф.М.Н., ДОЦ. КАФ. ИСКУССТВЕННОГО ИНТЕЛЛЕКТА И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
ГАХОВ АНДРЕЙ ВЛАДИМИРОВИЧ
ЧИСТЫЙ КОД
Clean Code
КОММЕНТАРИИ
Comments
Однострочные комментарии
Для кратких комментариев к
отдельным частям кода.
// quick check to see if we can acquire a lock, otherwise spawn to a thread pool
if (mdLock.tryAcquire()) {
createIndex(request, userListener, mdLock);
return;
}
while((phraseInfo = queue.top()) != null) { // pull until we crossed the spanEnd
if (phraseInfo.getEndOffset() > spanEnd) {
break;
}
}
Многострочные комментарии
Для длинных и подробных объяснений.
def luhn(candidate):
"""
Checks a candidate number for validity according to the Luhn
algorithm (used in validation of, for example, credit cards).
Both numeric and string candidates are accepted.
"""
if not isinstance(candidate, six.string_types):
candidate = str(candidate)
try:
evens = sum([int(c) for c in candidate[-1::-2]])
odds = sum([LUHN_ODD_LOOKUP[int(c)] for c in candidate[-2::-2]])
return ((evens + odds) % 10 == 0)
except ValueError: # Raised if an int conversion fails
return False
Общепринятые теги
FIXME – потенциальная проблема,
требующая специального внимания.
NOTE – замечание относительно кода
и объяснение «подводных камней».
TODO – описание возможных
будущих улучшений кода.
XXX – предупреждение о
проблематичном или «грязном» коде.
Общепринятые теги - примеры
public class ShapeModule extends AbstractModule {
@Override
protected void configure() {
// TODO: We could wrap this entire module in a JTS_AVAILABILITY check
if (ShapesAvailability.JTS_AVAILABLE) {
bind(ShapeFetchService.class).asEagerSingleton();
}
}
}
if not (isinstance(index, basestring)):
# FIXME: not sure what to do here, but we only want one
# index and somehow this isn't one index.
index = index[0]
return index
Читабельность
Комментарии пишутся для людей.
Лучше не оставить комментарий, чем
оставить плохой комментарий.
Комментарии для объяснений
намерений программиста.
Для объяснения того, что делает код
используйте правильное именование
и понятную логическую структуру.
Визуальное выделение
Не надо недооценивать значимость
пробелов и визульного выделения.
Используйте один из стандартных
стилей для вашего языка
программирования.
Например: javadoc, docstring
Во время кодирования
Пишите комментарии во время
написания кода, а не после.
При изменении кода не забывайте
изменять или дополнять
соотвествующие комментарии.
Полезные советы
Сделайте паузу и подумайте прежде,
чем писать комментарий.
Спросите себя, что для вас самое
непонятное в коде.
Объясните проблему самым простым
образом и с минимальным числом
слов.
ИМЕНОВАНИЕ
Naming
Именование
Используйте адекватные по длине
имена.
Например: «i» для индекса цикла,
«hostName» для переменной и
«TransportSearchModule» для класса.
Используйте осмысленные имена.
Например: dbName, lastAccessId и т.п.
Именование
Используйте только один язык для
именования (обычно, английский).
Не используйте в именах символы,
отличные от ASCII, даже если язык
программирования это позволяет.
Именование
Соблюдайте общепринятые
стандарты именования для вашего
языка программирования.
Будьте последовательны при
именовании.
Именование в Java
Используйте Lower Camel Case для
переменных, методов и аргументов.
Например: filterChain, getName,
setSchoolName(String schoolName)
Используйте Upper Camel Case для
именования классов.
Например: HttpServerAdapter
Именование в Java
Используйте заглавные буквы для
констант.
Например: DEFAULT_MIME_TYPES,
static final int DEFAULT_WIDTH
Используйте строчные буквы для
имен пакетов.
Например: com.google.common.collect
Именование в Python
Используйте символ «_» в начале
имен для private полей и методов,
классов и функций для внутреннего
пользования.
Используйте Upper Camel Case для
именования классов.
Например: HttpServerAdapter
Именование в Python
Используйте заглавные буквы для
констант.
Например: DEFAULT_MIME_TYPES
Используйте строчные буквы для
имен переенных, функций и методов,
разделяя слова знаком «_».
Например: db_name, get_connection
Именование переменных
Имена вида «value», «equals», «data»
в большинстве случаев не верны.
Имя переменной должно определять
ее содержание.
Не включайте в имя переменной
инфрмацию о типе.
Именование переменных
Переменная не нуждается в
приставках и суффиксах,
показывающих, что это переменная.
Например: «o_», «obj_», «m_» и т.п.
Не включайте в имя переменной
информацию о типе.
Например: studentNameString
Именование переменных
Не используйте зарезервированные
имена, даже если язык
программирования это позволяет.
Не используйте символы «l» (L в
нижнем регистре), «I» (i в верхнем
регистре) и «O» (буква О) в качестве
самостоятельных переменных.
Именование переменных
Не используйте без необходимости
очень длинные имена переменных.
Не используйте одно и то же имя в
разных контекстах в одной и той же
области видимости.
Именование методов и функций
В большинстве случаев, начинайте
имя с глагола.
Например: createPassword, getName,
addPermissions, isPasswordValid,
setAge, updateEmail, deleteAccount
Имя должно определять действие,
выполняемое данным методом или
функций.
Именование методов и функций
Имена должны описывать все
действия (в том числе и «побочные»).
Например: getOrCreate
Имена методов должны отвечать
уровню абстракции класса.
Например: для класса Modem имеет
смысл иметь метод connect(), но не
call().
Именование классов
Имя должно быть существительным
в единственном числе (но может
включать так же и прилагательные).
Например: Account, BasicInterface
Испольуйте по-возможности
стандартные ключевые слова.
Например: «Interface», «Context»,
«Module» и т.п.
ИСКЛЮЧЕНИЯ
Exceptions
Обработка исключений
Используйте текты сообщений об
ошибках, понятные пользователю.
Не включайте в сообщения об
ошибках данные, являющиеся
персональными (например, пароли
или номера кредитнх карт), даже если
вы выводите их только в log-файлы.
Обработка исключений
Используйте нестандартные
исключения только при крайней
необходимости.
При создании классов нестандартных
исключений давайте им само-
определяющие имена.
Например: RateLimitException
Обработка исключений
Обрабатывайте только исключения,
которые вы должны обработать.
Используйте глобальные обработчики
исключений для обработки всех
необработанных исключений в
программе и вывода общего
сообщения об ошибке. Не забывайте
освобождать ресурсы.
Обработка исключений
Не используйте исключения для
контроля за потоком выполнения:
static Boolean IsProductExists(string ProductId)
{
//... search for the Product
if ( dr.Read(ProductId) == 0 ) // no record found
{
throw(new Exception("Product Not found"));
}
return true;
}
Обработка исключений
Отсутствие продукта не является
здесь исключительной ситуацией.
Имя функции предполагает наличие
возвращаемого значения (false в
данном случае).
Генерация исключения как правило
намного медленнее, чем возвращение
значения.
ПРАВИЛА ОПТИМИЗАЦИИ
Rules of optimization
Д. Кнут, «Structured Programming with
go to Statements», 1974
Преждевременная оптимизация
— корень всех зол.
Premature optimization is the root
of all evil.
Правила оптимизации
Make it clear before you make it fast
Make it correct before you make it fast
«Elements Of Programming Style», Brian Kernighan, P. Plauger, 1978

Contenu connexe

En vedette

Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions
Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions
Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions Ogilvy
 
Empleo con apoyo. principios, valores y proceso.
Empleo con apoyo. principios, valores y proceso.Empleo con apoyo. principios, valores y proceso.
Empleo con apoyo. principios, valores y proceso.José María
 
Estrategia para privatizar pemex
Estrategia para privatizar pemexEstrategia para privatizar pemex
Estrategia para privatizar pemexResistencia2018
 
How effective is modularization
How effective is modularizationHow effective is modularization
How effective is modularizationSyedArsal
 
Hobbim az olvasás
Hobbim az olvasásHobbim az olvasás
Hobbim az olvasásmatraiorsi
 
Grafico diario del dax perfomance index para el 12 07-2012
Grafico diario del dax perfomance index para el 12 07-2012Grafico diario del dax perfomance index para el 12 07-2012
Grafico diario del dax perfomance index para el 12 07-2012Experiencia Trading
 
Redweb Innovation 2010
Redweb Innovation 2010Redweb Innovation 2010
Redweb Innovation 2010David Burton
 
Turn your information into a story that resonates
Turn your information into a story that resonatesTurn your information into a story that resonates
Turn your information into a story that resonatesPatricia McMillan
 
03 - Presidential Powers
03 - Presidential Powers03 - Presidential Powers
03 - Presidential PowersPaul English
 
WCPT Disaster Management Report 2016
WCPT Disaster Management Report 2016WCPT Disaster Management Report 2016
WCPT Disaster Management Report 2016Dr. Chris Stout
 

En vedette (20)

課題
課題課題
課題
 
Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions
Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions
Why Images Are Worth More Words Than Ever #OgilvyCannes / #CannesLions
 
Empleo con apoyo. principios, valores y proceso.
Empleo con apoyo. principios, valores y proceso.Empleo con apoyo. principios, valores y proceso.
Empleo con apoyo. principios, valores y proceso.
 
Estrategia para privatizar pemex
Estrategia para privatizar pemexEstrategia para privatizar pemex
Estrategia para privatizar pemex
 
Motivación laboral
Motivación laboralMotivación laboral
Motivación laboral
 
How effective is modularization
How effective is modularizationHow effective is modularization
How effective is modularization
 
Wearables - Player oder Pipe
Wearables - Player oder PipeWearables - Player oder Pipe
Wearables - Player oder Pipe
 
Hobbim az olvasás
Hobbim az olvasásHobbim az olvasás
Hobbim az olvasás
 
Grafico diario del dax perfomance index para el 12 07-2012
Grafico diario del dax perfomance index para el 12 07-2012Grafico diario del dax perfomance index para el 12 07-2012
Grafico diario del dax perfomance index para el 12 07-2012
 
Redweb Innovation 2010
Redweb Innovation 2010Redweb Innovation 2010
Redweb Innovation 2010
 
contabilidad gubernamental
contabilidad gubernamentalcontabilidad gubernamental
contabilidad gubernamental
 
Presentación TynTun
Presentación TynTunPresentación TynTun
Presentación TynTun
 
Scala traits
Scala traitsScala traits
Scala traits
 
Material para investidores
Material para investidoresMaterial para investidores
Material para investidores
 
Turn your information into a story that resonates
Turn your information into a story that resonatesTurn your information into a story that resonates
Turn your information into a story that resonates
 
Sangeetha Vairavel
Sangeetha VairavelSangeetha Vairavel
Sangeetha Vairavel
 
Mini guida stile di pubblicazione dei contenuti digitali sui social network
 Mini guida stile di pubblicazione dei contenuti digitali sui social network Mini guida stile di pubblicazione dei contenuti digitali sui social network
Mini guida stile di pubblicazione dei contenuti digitali sui social network
 
03 - Presidential Powers
03 - Presidential Powers03 - Presidential Powers
03 - Presidential Powers
 
Much ado about...documents nashville
Much ado about...documents nashvilleMuch ado about...documents nashville
Much ado about...documents nashville
 
WCPT Disaster Management Report 2016
WCPT Disaster Management Report 2016WCPT Disaster Management Report 2016
WCPT Disaster Management Report 2016
 

Similaire à Семинар ФКН: современные подходы к разработке ПО - часть 2

Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Спецкурс 2014, занятие 3. Абстракции, именование, документирование
Спецкурс 2014, занятие 3. Абстракции, именование, документированиеСпецкурс 2014, занятие 3. Абстракции, именование, документирование
Спецкурс 2014, занятие 3. Абстракции, именование, документирование7bits
 
курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения7bits
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Fedor Malyshkin
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2SeleniumAgile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2Seleniumjazzteam
 
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко ДмитрийSolit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрийsolit
 
Coding Standards
Coding StandardsCoding Standards
Coding Standardsroadhump
 
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.Igor Shkulipa
 
Промышленная разработка ПО. Лекция 4. Особенности работы программиста. Ча…
Промышленная разработка ПО. Лекция 4. Особенности работы программиста.  Ча…Промышленная разработка ПО. Лекция 4. Особенности работы программиста.  Ча…
Промышленная разработка ПО. Лекция 4. Особенности работы программиста. Ча…Mikhail Payson
 
Стажировка-2015. Разработка. Занятие 8. Абстракции, именование,документирование
Стажировка-2015. Разработка. Занятие 8. Абстракции, именование,документированиеСтажировка-2015. Разработка. Занятие 8. Абстракции, именование,документирование
Стажировка-2015. Разработка. Занятие 8. Абстракции, именование,документирование7bits
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеSergey Nemchinsky
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Elias Fofanov
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with SeleniumSergey Shvets
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 

Similaire à Семинар ФКН: современные подходы к разработке ПО - часть 2 (20)

Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Спецкурс 2014, занятие 3. Абстракции, именование, документирование
Спецкурс 2014, занятие 3. Абстракции, именование, документированиеСпецкурс 2014, занятие 3. Абстракции, именование, документирование
Спецкурс 2014, занятие 3. Абстракции, именование, документирование
 
курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2SeleniumAgile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
Agile Java Development компания JazzTeam - Техническая презентация Xml2Selenium
 
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко ДмитрийSolit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
Solit 2013, Разбор конкретного примера – продукта XML2Selenium, Горячко Дмитрий
 
Coding Standards
Coding StandardsCoding Standards
Coding Standards
 
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
Промышленная разработка ПО. Лекция 4. Особенности работы программиста. Ча…
Промышленная разработка ПО. Лекция 4. Особенности работы программиста.  Ча…Промышленная разработка ПО. Лекция 4. Особенности работы программиста.  Ча…
Промышленная разработка ПО. Лекция 4. Особенности работы программиста. Ча…
 
Стажировка-2015. Разработка. Занятие 8. Абстракции, именование,документирование
Стажировка-2015. Разработка. Занятие 8. Абстракции, именование,документированиеСтажировка-2015. Разработка. Занятие 8. Абстракции, именование,документирование
Стажировка-2015. Разработка. Занятие 8. Абстракции, именование,документирование
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 

Plus de Andrii Gakhov

Let's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureLet's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureAndrii Gakhov
 
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...Andrii Gakhov
 
Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...Andrii Gakhov
 
Implementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and LuaImplementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and LuaAndrii Gakhov
 
Pecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food TraditionsPecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food TraditionsAndrii Gakhov
 
Probabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. SimilarityProbabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. SimilarityAndrii Gakhov
 
Probabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. FrequencyProbabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. FrequencyAndrii Gakhov
 
Probabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. CardinalityProbabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. CardinalityAndrii Gakhov
 
Вероятностные структуры данных
Вероятностные структуры данныхВероятностные структуры данных
Вероятностные структуры данныхAndrii Gakhov
 
Recurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: TheoryRecurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: TheoryAndrii Gakhov
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksAndrii Gakhov
 
Swagger / Quick Start Guide
Swagger / Quick Start GuideSwagger / Quick Start Guide
Swagger / Quick Start GuideAndrii Gakhov
 
API Days Berlin highlights
API Days Berlin highlightsAPI Days Berlin highlights
API Days Berlin highlightsAndrii Gakhov
 
ELK - What's new and showcases
ELK - What's new and showcasesELK - What's new and showcases
ELK - What's new and showcasesAndrii Gakhov
 
Apache Spark Overview @ ferret
Apache Spark Overview @ ferretApache Spark Overview @ ferret
Apache Spark Overview @ ferretAndrii Gakhov
 
Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014Andrii Gakhov
 
Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014Andrii Gakhov
 
Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014Andrii Gakhov
 
Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014Andrii Gakhov
 

Plus de Andrii Gakhov (20)

Let's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureLet's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architecture
 
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
Exceeding Classical: Probabilistic Data Structures in Data Intensive Applicat...
 
Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...Too Much Data? - Just Sample, Just Hash, ...
Too Much Data? - Just Sample, Just Hash, ...
 
DNS Delegation
DNS DelegationDNS Delegation
DNS Delegation
 
Implementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and LuaImplementing a Fileserver with Nginx and Lua
Implementing a Fileserver with Nginx and Lua
 
Pecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food TraditionsPecha Kucha: Ukrainian Food Traditions
Pecha Kucha: Ukrainian Food Traditions
 
Probabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. SimilarityProbabilistic data structures. Part 4. Similarity
Probabilistic data structures. Part 4. Similarity
 
Probabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. FrequencyProbabilistic data structures. Part 3. Frequency
Probabilistic data structures. Part 3. Frequency
 
Probabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. CardinalityProbabilistic data structures. Part 2. Cardinality
Probabilistic data structures. Part 2. Cardinality
 
Вероятностные структуры данных
Вероятностные структуры данныхВероятностные структуры данных
Вероятностные структуры данных
 
Recurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: TheoryRecurrent Neural Networks. Part 1: Theory
Recurrent Neural Networks. Part 1: Theory
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected Talks
 
Swagger / Quick Start Guide
Swagger / Quick Start GuideSwagger / Quick Start Guide
Swagger / Quick Start Guide
 
API Days Berlin highlights
API Days Berlin highlightsAPI Days Berlin highlights
API Days Berlin highlights
 
ELK - What's new and showcases
ELK - What's new and showcasesELK - What's new and showcases
ELK - What's new and showcases
 
Apache Spark Overview @ ferret
Apache Spark Overview @ ferretApache Spark Overview @ ferret
Apache Spark Overview @ ferret
 
Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014Data Mining - lecture 8 - 2014
Data Mining - lecture 8 - 2014
 
Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014Data Mining - lecture 7 - 2014
Data Mining - lecture 7 - 2014
 
Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014Data Mining - lecture 6 - 2014
Data Mining - lecture 6 - 2014
 
Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014Data Mining - lecture 5 - 2014
Data Mining - lecture 5 - 2014
 

Семинар ФКН: современные подходы к разработке ПО - часть 2

  • 1. СОВРЕМЕННЫЕ ПОДХОДЫ К РАЗРАБОТКЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ ИМЕНИ В. Н. КАРАЗИНА ФАКУЛЬТЕТ КОМПЬЮТЕРНЫХ НАУК КАФ. ИСКУССТВЕННОГО ИНТЕЛЛЕКТА И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ К.Ф.М.Н., ДОЦ. КАФ. ИСКУССТВЕННОГО ИНТЕЛЛЕКТА И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ГАХОВ АНДРЕЙ ВЛАДИМИРОВИЧ
  • 4. Однострочные комментарии Для кратких комментариев к отдельным частям кода. // quick check to see if we can acquire a lock, otherwise spawn to a thread pool if (mdLock.tryAcquire()) { createIndex(request, userListener, mdLock); return; } while((phraseInfo = queue.top()) != null) { // pull until we crossed the spanEnd if (phraseInfo.getEndOffset() > spanEnd) { break; } }
  • 5. Многострочные комментарии Для длинных и подробных объяснений. def luhn(candidate): """ Checks a candidate number for validity according to the Luhn algorithm (used in validation of, for example, credit cards). Both numeric and string candidates are accepted. """ if not isinstance(candidate, six.string_types): candidate = str(candidate) try: evens = sum([int(c) for c in candidate[-1::-2]]) odds = sum([LUHN_ODD_LOOKUP[int(c)] for c in candidate[-2::-2]]) return ((evens + odds) % 10 == 0) except ValueError: # Raised if an int conversion fails return False
  • 6. Общепринятые теги FIXME – потенциальная проблема, требующая специального внимания. NOTE – замечание относительно кода и объяснение «подводных камней». TODO – описание возможных будущих улучшений кода. XXX – предупреждение о проблематичном или «грязном» коде.
  • 7. Общепринятые теги - примеры public class ShapeModule extends AbstractModule { @Override protected void configure() { // TODO: We could wrap this entire module in a JTS_AVAILABILITY check if (ShapesAvailability.JTS_AVAILABLE) { bind(ShapeFetchService.class).asEagerSingleton(); } } } if not (isinstance(index, basestring)): # FIXME: not sure what to do here, but we only want one # index and somehow this isn't one index. index = index[0] return index
  • 8. Читабельность Комментарии пишутся для людей. Лучше не оставить комментарий, чем оставить плохой комментарий. Комментарии для объяснений намерений программиста. Для объяснения того, что делает код используйте правильное именование и понятную логическую структуру.
  • 9. Визуальное выделение Не надо недооценивать значимость пробелов и визульного выделения. Используйте один из стандартных стилей для вашего языка программирования. Например: javadoc, docstring
  • 10. Во время кодирования Пишите комментарии во время написания кода, а не после. При изменении кода не забывайте изменять или дополнять соотвествующие комментарии.
  • 11. Полезные советы Сделайте паузу и подумайте прежде, чем писать комментарий. Спросите себя, что для вас самое непонятное в коде. Объясните проблему самым простым образом и с минимальным числом слов.
  • 13. Именование Используйте адекватные по длине имена. Например: «i» для индекса цикла, «hostName» для переменной и «TransportSearchModule» для класса. Используйте осмысленные имена. Например: dbName, lastAccessId и т.п.
  • 14. Именование Используйте только один язык для именования (обычно, английский). Не используйте в именах символы, отличные от ASCII, даже если язык программирования это позволяет.
  • 15. Именование Соблюдайте общепринятые стандарты именования для вашего языка программирования. Будьте последовательны при именовании.
  • 16. Именование в Java Используйте Lower Camel Case для переменных, методов и аргументов. Например: filterChain, getName, setSchoolName(String schoolName) Используйте Upper Camel Case для именования классов. Например: HttpServerAdapter
  • 17. Именование в Java Используйте заглавные буквы для констант. Например: DEFAULT_MIME_TYPES, static final int DEFAULT_WIDTH Используйте строчные буквы для имен пакетов. Например: com.google.common.collect
  • 18. Именование в Python Используйте символ «_» в начале имен для private полей и методов, классов и функций для внутреннего пользования. Используйте Upper Camel Case для именования классов. Например: HttpServerAdapter
  • 19. Именование в Python Используйте заглавные буквы для констант. Например: DEFAULT_MIME_TYPES Используйте строчные буквы для имен переенных, функций и методов, разделяя слова знаком «_». Например: db_name, get_connection
  • 20. Именование переменных Имена вида «value», «equals», «data» в большинстве случаев не верны. Имя переменной должно определять ее содержание. Не включайте в имя переменной инфрмацию о типе.
  • 21. Именование переменных Переменная не нуждается в приставках и суффиксах, показывающих, что это переменная. Например: «o_», «obj_», «m_» и т.п. Не включайте в имя переменной информацию о типе. Например: studentNameString
  • 22. Именование переменных Не используйте зарезервированные имена, даже если язык программирования это позволяет. Не используйте символы «l» (L в нижнем регистре), «I» (i в верхнем регистре) и «O» (буква О) в качестве самостоятельных переменных.
  • 23. Именование переменных Не используйте без необходимости очень длинные имена переменных. Не используйте одно и то же имя в разных контекстах в одной и той же области видимости.
  • 24. Именование методов и функций В большинстве случаев, начинайте имя с глагола. Например: createPassword, getName, addPermissions, isPasswordValid, setAge, updateEmail, deleteAccount Имя должно определять действие, выполняемое данным методом или функций.
  • 25. Именование методов и функций Имена должны описывать все действия (в том числе и «побочные»). Например: getOrCreate Имена методов должны отвечать уровню абстракции класса. Например: для класса Modem имеет смысл иметь метод connect(), но не call().
  • 26. Именование классов Имя должно быть существительным в единственном числе (но может включать так же и прилагательные). Например: Account, BasicInterface Испольуйте по-возможности стандартные ключевые слова. Например: «Interface», «Context», «Module» и т.п.
  • 28. Обработка исключений Используйте текты сообщений об ошибках, понятные пользователю. Не включайте в сообщения об ошибках данные, являющиеся персональными (например, пароли или номера кредитнх карт), даже если вы выводите их только в log-файлы.
  • 29. Обработка исключений Используйте нестандартные исключения только при крайней необходимости. При создании классов нестандартных исключений давайте им само- определяющие имена. Например: RateLimitException
  • 30. Обработка исключений Обрабатывайте только исключения, которые вы должны обработать. Используйте глобальные обработчики исключений для обработки всех необработанных исключений в программе и вывода общего сообщения об ошибке. Не забывайте освобождать ресурсы.
  • 31. Обработка исключений Не используйте исключения для контроля за потоком выполнения: static Boolean IsProductExists(string ProductId) { //... search for the Product if ( dr.Read(ProductId) == 0 ) // no record found { throw(new Exception("Product Not found")); } return true; }
  • 32. Обработка исключений Отсутствие продукта не является здесь исключительной ситуацией. Имя функции предполагает наличие возвращаемого значения (false в данном случае). Генерация исключения как правило намного медленнее, чем возвращение значения.
  • 34. Д. Кнут, «Structured Programming with go to Statements», 1974 Преждевременная оптимизация — корень всех зол. Premature optimization is the root of all evil.
  • 35. Правила оптимизации Make it clear before you make it fast Make it correct before you make it fast «Elements Of Programming Style», Brian Kernighan, P. Plauger, 1978