Это плохая практика иметь несколько классов в одном файле?

Раньше у меня был один класс для одного файла. Например car.cs имеет класс car . Но так как я программирую больше классов, я бы хотел добавить их в один и тот же файл. Например, у car.cs есть класс car и door, класс и т. Д.

Мой вопрос хорош для Java, C #, PHP или любого другого языка программирования. Должен ли я попытаться не иметь несколько классов в одном файле, или это нормально?

11.12.2008 19:50:37
15 ОТВЕТОВ
РЕШЕНИЕ

Я думаю, вы должны попытаться сохранить свой код до 1 класса на файл.

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

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

77
2.11.2011 13:20:48
Увидев, что kotlin может делать в одном файле, я начинаю верить, что некоторые вещи, такие как DTO, могут быть в одном файле.
John Tribe 21.06.2018 14:44:20
Чтобы добавить к этому, классы, которые вы располагаете в одном и том же файле, как правило, тесно связаны, что может затруднить редактирование, поскольку не так легко одновременно просматривать несколько классов. Вы должны много прокручивать. Разделенное представление помогает, но это не так просто, как просто иметь отдельное окно для каждого файла / класса.
Chad Hedgcock 27.07.2018 20:00:34

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

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

9
11.12.2008 19:54:06

Это может быть плохо с точки зрения будущего развития и ремонтопригодности. Намного легче запомнить, где находится класс Car, если у вас есть класс Car.cs. Где бы вы искали класс Widget, если Widget.cs не существует? Это автомобильный виджет? Это виджет двигателя? О, может быть, это виджет бублик.

6
11.12.2008 19:55:09
Как упомянуто в stackoverflow.com/questions/360643/… .. , с обычными инструментами навигации вам не нужно перемещаться по файлу в любом случае. Вместо этого вы перемещаетесь по классам / членам.
Suma 5.04.2011 15:25:24

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

7
11.12.2008 19:55:39

Только раз , когда я считаю расположение файлов, когда я должен создать новые классы. В противном случае я никогда не ориентируюсь по структуре файлов. Я использую «перейти к классу» или «перейти к определению».

Я знаю, что это отчасти вопрос обучения; Освобождение себя от физической файловой структуры проектов требует практики. Это очень полезно, хотя;)

Если вам нравится помещать их в один файл, будьте моим гостем. Не могу сделать это с публичными классами в Java, хотя;)

6
11.12.2008 20:07:18

Как правило, один класс / один файл - это путь. Я часто держу несколько определений интерфейса в одном файле. Несколько классов в одном файле? Только если они как-то очень тесно связаны и очень маленькие (<5 методов и членов)

2
11.12.2008 19:58:51

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

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

1
11.12.2008 19:59:47

В Java один публичный класс на файл - это способ работы языка. Группа файлов Java может быть собрана в пакет.

Однако в Python файлы являются «модулями» и обычно имеют ряд тесно связанных классов. Пакет Python - это каталог, как и пакет Java.

Это дает Python дополнительный уровень группировки между классом и пакетом.

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

26
11.12.2008 20:03:07

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

7
11.12.2008 20:06:34

Хорошим правилом является один класс на файл, но целесообразно сделать некоторые исключения. Например, если я работаю в проекте, где большинство классов имеют связанные типы коллекций, часто я буду хранить класс и его коллекцию в одном файле, например:

public class Customer { /* whatever */ }

public class CustomerCollection : List<Customer> { /* whatever */ }

Лучшее практическое правило - хранить один класс на файл, за исключением случаев, когда это начинает усложнять, а не облегчать. Так как поиск в файлах Visual Studio настолько эффективен, вам, вероятно, не придется тратить много времени на просмотр файловой структуры.

19
11.12.2008 20:14:48
Нет, это плохой совет. Воспользуйтесь советом принятого ответа. Вы должны отделить хранилище объектов от класса, который вы сохраняете. Это просто создает ненужную путаницу.
Hudson 9.09.2015 06:46:49
@ Хадсон Я не вижу никакого кода "хранилища объектов" выше.
Ryan Lundy 28.09.2018 06:26:38

Как это часто бывает в программировании, это сильно зависит от ситуации.

Например, какова сплоченность рассматриваемых классов? Они тесно связаны? Они полностью ортогональны? Они связаны по функциональности?

Для веб-фреймворка было бы нецелесообразно предоставлять виджеты общего назначения. Какой бы файл не содержал BaseWidget, TextWidget, CharWidget и т. Д.

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

Когда классы ортогональны и не имеют ничего общего друг с другом, группирование в один файл действительно будет искусственным. Предположим приложение для управления роботизированной фабрикой, которая собирает автомобили. Файл, называемый частями, содержащий CarParts и RobotParts, был бы бессмысленным ... маловероятно, чтобы существовала большая связь между заказом запасных частей для технического обслуживания и деталями, которые производит завод. Такое объединение не добавит никакой информации или знаний о системе, которую вы разрабатываете.

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

2
11.12.2008 20:25:30

Нет, я не думаю, что это совсем плохая практика. Под этим я подразумеваю, что в целом лучше иметь отдельный файл для каждого класса, но, безусловно, есть хорошие исключительные случаи, когда лучше иметь несколько классов в одном файле. Хорошим примером этого является группа классов Exception, если у вас есть несколько десятков таких классов для данной группы, имеет ли смысл иметь отдельный отдельный файл для каждого двухклассного класса? Я бы не стал спорить. В этом случае наличие группы исключений в одном классе намного менее громоздко и просто ИМХО.

14
24.09.2013 22:36:42

Ответ Smalltalk: у вас не должно быть файлов (для программирования). Они делают управление версиями и навигацию болезненными.

1
11.01.2010 19:12:15

Вы должны воздерживаться от этого, если у вас нет веских причин.

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

В вашем случае автомобиль и дверь вообще не связаны между собой, и найти класс дверей в файле car.cs было бы неожиданно, так что не делайте этого.

2
22.02.2012 16:21:58

Так как ваша IDE предоставляет вам функциональность " Navigate to ", и вы имеете некоторый контроль над пространством имен в ваших классах, то нижеприведенные преимущества наличия нескольких классов в одном файле вполне стоят мне.

Родитель - Детские классы

Во многих случаях я считаю весьма полезным иметь унаследованные классы в своем файле базовых классов.

Тогда довольно просто увидеть, какие свойства и методы наследует ваш дочерний класс, и файл обеспечивает более быстрый обзор всей функциональности.

Public: Small - Helper - DTO Classes

Когда вам нужно несколько простых и маленьких классов для определенной функциональности, я нахожу излишним иметь файл со всеми ссылками и включает в себя всего 4-8 классов Liner .....

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

В целом нарушение правила Iron (1 класс на файл) дает некоторую дополнительную свободу в организации вашего кода.

Что произойдет потом, действительно зависит от вашей IDE, языка, командной коммуникации и организаторских навыков.

Но если вы хотите этой свободы, зачем жертвовать ею ради железного правила?

8
16.11.2016 15:28:18