Сколько классов должен поместить программист в один файл? - PullRequest
16 голосов
/ 22 января 2009

На каком объектно-ориентированном языке вы следуете руководству для группировки классов в один файл? Вы всегда даете каждому классу отдельный файл? Вы соединяете тесно связанные классы? Вы когда-нибудь указывали пару реализаций интерфейса в одном файле? Делаете ли вы это, основываясь на том, сколько строк кода может быть у реализации или насколько «загромождено» может выглядеть пользователь класса? Или пользователь предпочел бы, чтобы все было в одном месте?

Ответы [ 11 ]

23 голосов
/ 22 января 2009

Лично я предлагаю один класс на файл , если вторичные классы не являются частными для первичного класса в файле. Например, вложенный класс в C # останется в файле родительских классов, но служебные классы, которые могут быть полезными в других местах, будут разбиты на их собственный файл или даже пространство имен.

Ключ к пониманию вашей среды и того, где люди будут искать вещи. Если есть установленная методология, подумайте, прежде чем ее расстроить. Если ваши коллеги ожидают, что связанные, тесно связанные классы будут находиться в одном документе, необходимость их поиска может раздражать (хотя в современных IDE это не должно быть проблемой).

Еще одна причина разбивать вещи на большее количество файлов, а не на меньшее, - это контроль версий. Если вы сделаете небольшое изменение, это должно изменить только маленький файл, где это возможно. Если вы сделаете быстрое изменение, очевидно, просматривая журналы, потому что все файлы (и косвенно, классы), которые были затронуты, отмечены.

21 голосов
/ 22 января 2009

Я думаю, что лучшие практики на всех языках ОО, которые я когда-либо использовал, - это иметь один класс в одном файле. Я полагаю, что некоторые языки могут требовать этого, но я не уверен в этом факте. Но я бы сказал, что один класс на файл и имя файла, совпадающее с именем класса (а также структура каталогов, соответствующая большей части структуры пакета), является наилучшей практикой.

8 голосов
/ 22 января 2009

1 класс = 2 файла. .H и .c, вы, дети, так повезло:)

5 голосов
/ 22 января 2009

Не существует строгого и быстрого правила, которое всегда должно соблюдаться (если только определенный язык не соблюдает его). Есть веские причины иметь только один класс или иметь несколько классов в файле. И это зависит от языка.

В C # и Java люди склонны придерживаться одного файла на класс.

Я бы сказал, в C ++, хотя я часто помещаю несколько классов в один файл. Часто эти классы маленькие и очень родственные. Например. Один класс для каждого сообщения в некотором протоколе связи. В этом случае файл для каждого из них будет означать много файлов и фактически усложнит обслуживание и чтение кода, чем если бы они были в одном файле.

В C ++ реализация класса отделена от определения класса, поэтому каждый класс {/ body /} меньше, чем в другом языке, и это означает, что классы удобнее измерять для группировки в один файл.

В C ++, если вы пишете библиотеку (например, стандартную библиотеку шаблонов), вы можете поместить все классы в один файл. Пользователям нужно только включить один заголовочный файл, и тогда они получат все классы, чтобы им было легче работать.

Есть баланс. Ответ заключается в том, что легче всего понять и поддерживать. По умолчанию имеет смысл иметь один класс на файл, но существует множество случаев, когда более удобно работать со связанным набором классов, если они определены в одном файле.

3 голосов
/ 22 января 2009

Я помещаю классы в один файл, если они принадлежат друг другу, по техническим или эстетическим причинам. Например, в приложении, предоставляющем интерфейс плагина, классы Plugin (базовый класс для плагинов) и PluginManager я бы обычно собирал в один файл. Однако, если файл станет слишком большим на мой вкус, я разделю их на отдельный файл.

Замечу, что я пишу код в основном на Python, и это влияет на мой дизайн. Python очень гибок в том, как разделить вещи на модули, и имеет хорошие инструменты для управления пространствами имен вещей. Например, я обычно помещаю весь код приложения в модуль Python (каталог с __init__.py) и заставляю модуль импортировать определенные имена из подмодулей. Тогда API выглядит как applib.PluginManager, а не applib.pluginstuff.PluginManager.

Это позволяет легко перемещать вещи, что также позволяет мне не быть таким суетливым, когда я создаю дизайн: я всегда могу исправить вещи позже.

2 голосов
/ 22 января 2009

Я стараюсь сохранить один класс на файл (как и большинство из вышеперечисленных), если они не являются маленькими классами. Если их много, я могу разделить их на предметы в противном случае. Но обычно я просто храню их все в одном файле со свертыванием кода в редакторах. Для моих личных хаков это не стоит (минимальных) усилий для меня.

2 голосов
/ 22 января 2009

Один на файл - это наш стандарт. Единственное исключение состоит в том, что для класса и его типизированной коллекции мы собираем их вместе.

Со временем я понял, что «маленький класс» всегда имеет тенденцию к росту. И тогда вы захотите разделить их, запутав всех в команде (и себя).

2 голосов
/ 22 января 2009

Один класс = один файл. Всегда. Кроме случаев, когда один класс = несколько файлов в C #, или класс, конечно, содержит внутренние классы и т.д .;)

1 голос
/ 22 января 2009

Один класс на файл кажется стандартным. Я тоже так обычно делаю.

Несколько раз я уходил от этого. Особенно, когда меньший класс является членом другого класса. Например, при проектировании структуры данных я бы, вероятно, реализовал класс «узел» в том же файле, что и класс «большая структура».

0 голосов
/ 24 января 2009

Я предпочитаю от 1 до 1 для классов, если внутренний класс не будет полностью закрытым. Даже тогда я обычно разбираюсь с этим для простоты его поиска и отслеживания изменений в SVN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...