Примеры кода на C #, но это общий вопрос ОО.
Я знаю, что в соответствии с правилами ОО соединение классов должно быть сведено к минимуму, а члены должны быть по возможности конфиденциальными, и т. Д.
Рассмотрим этот пример:
Вы пишете эзотерическую программу, которая имеет некоторый набор данных (я не говорю о System.Data.DataSet ), который используется буквально в каждом аспекте программы. На самом деле, программа в основном существует только для загрузки, отображения, манипулирования и сохранения набора данных. Кроме того, в любой момент может быть загружен только один набор данных, и он загружается при открытии программы.
Если строго следовать правилам ОО, у нас будет
public void ShowSomeGraphs(IData data)
{
// do stuff with data which implements IData
}
однако мы потенциально можем хранить public static Data
член в Program
, например.
public void ShowSomeGraphs()
{
// do stuff with Program.Data
}
С одной стороны, мы обменяли чуть более короткую сигнатуру функции на значительно улучшенную связь классов. С другой стороны, мы больше не передаем параметр данных практически каждой функции, везде .
Правильный ответ * , вероятно, таков: по возможности избегайте связывания классов. Локальные переменные данных являются просто указателями, поэтому накладные расходы памяти незначительны, а поскольку классы не связаны, они могут быть использованы в других местах позднее.
Хотя, с реалистической точки зрения, структура класса Data, вероятно, будет феноменально отличаться в другом приложении, так что вы не можете просто извлечь класс из этой программы и вставить его куда-нибудь еще без каких-либо настроек. Дополнительное время и усилия, необходимые для написания классов таким образом, чтобы их можно было просто отбросить, могут быть трудно оправдать заинтересованную сторону.
Сейчас я работаю над такого рода программами, и я использовал подход OO-canon: параметры данных передаются там, где это необходимо. Я минимизировал соединение классов с интерфейсом IData, чтобы обобщить набор данных для будущего повторного кода. использовать. Учитывая приложение, я почти уверен, что этот код никогда не будет использоваться повторно. Без этих дополнительных интерфейсов и абстракции программа работала бы точно так же, как это касается конечного пользователя, но для меня это представляло бы значительно меньше головной боли и времени разработки.
Что вы думаете об этом? Как вы думаете, оправданно ли тратить все дополнительное время на написание интерфейсов и обобщений, чтобы гарантировать, что классы по возможности отделены, особенно когда вы не можете видеть, как классы используются в других местах позже?