Императив против вопросительных методов
При реализации класса лучше практиковать возврат значения для методов (вопросительный) или просто манипулировать атрибутами класса непосредственно внутри метода (императив).
Например, у меня есть класс, который создает строку для вывода в файл CSV. Я мог бы сделать это так:
String output = ""
String records[] = //list of record strings
void extract()
extractHeader()
extractRecords()
void extractHeader()
output += "FirstName,LastName,PhoneNumber"
void extractRecords()
For Each record In Records
output += records.toString()
Или я мог бы сделать это так:
void extract()
output += extractHeader()
output += extractRecords()
string extractHeader()
// return header string
string extractRecords()
// return records as string
Это просто вопрос личных предпочтений или существует общепринятая рекомендация по лучшей практике?
Ура,
Эндрю
2 ответа
Разделение проблем - это моя метрика (и не слишком быстрая). Это действительно часто напрямую связано с хранением программ СУХОЙ.
Вот две проблемы, которые я вижу: логика и использование. Основная логика extractRecords
это запустить цикл. Если вы когда-нибудь хотели снова использовать эту логику, ваш первый вариант теперь имеет эту логику очень сильно (в отличие от слабосвязанной) с очень специфическим применением / использованием этой логики.
Именно поэтому я по умолчанию всегда склоняюсь к функциональному программированию, а не ко всему, что требует состояния или объектно-ориентированного подхода, если я могу.
Также связана и, возможно, может быть просто другая формулировка той же вещи, эта статья: "говори, не спрашивай".
Прочитайте главу 5 книги Code Complete 2, доступную для предварительного просмотра, здесь: http://www.cc2e.com/ Это дает представление о связи, которая применима для этого вопроса.