Я прочитал « Чистый код» дяди Боба несколько месяцев назад, и это сильно повлияло на то, как я пишу код. Даже если бы казалось, что он повторяет вещи, которые должен знать каждый программист, объединение их всех и применение на практике приводит к гораздо более чистому коду. В частности, я обнаружил, что разделение больших функций на множество крошечных функций и разбиение больших классов на множество крошечных классов невероятно полезно.
Теперь по вопросу. Все примеры книги на Java, в то время как я работал на C ++ в течение последних нескольких лет. Как идеи Чистого кода будут распространяться на использование пространств имен, которых нет в Java? (Да, я знаю о пакетах Java, но это не совсем то же самое.)
Имеет ли смысл применять идею создания множества крошечных объектов, каждый с четко определенной ответственностью, к пространствам имен? Всегда ли небольшая группа связанных классов должна быть заключена в пространство имен? Это способ управлять сложностью наличия множества крошечных классов, или затраты на управление множеством пространств имен будут чрезмерно высокими?
Изменить: На мой вопрос ответ в этой записи Википедии о принципах пакета .
Ответы:
(Я не читал Чистый код и не знаю много Java.)
Да, так же, как это происходит с рефакторингом на несколько классов и несколько функций.
На самом деле не отвечая: да, вы должны хотя бы использовать одно пространство имен верхнего уровня. Это может быть основано на проекте, организации или как угодно, но использование нескольких глобальных имен уменьшит конфликты имен. Единое пространство имен для группировки всего остального под ним вводит только одно глобальное имя. (Исключая внешние функции "C", но это связано с совместимостью C и влияет только на другие внешние функции "C".)
Следует ли заключить небольшую группу связанных классов в пространство имен, выделенное для них? Вероятно. Особенно если вы используете общий префикс для этих классов - FrobberThing, FrobberThang, FrobberDoohickey - вы должны рассмотреть пространство имен - frobber :: Thing и так далее. Это все еще будет в вашем корневом пространстве имен или другом пространстве имен, если они являются частью более крупного проекта.
Используя приведенный выше пример с префиксными именами, управлять frobber :: Thing не сложнее, чем FrobberThing. Это может быть даже проще с некоторыми инструментами, такими как документирование и завершение кода. Есть разница с ADL, но это может работать в вашу пользу: меньшее количество имен в связанных пространствах имен упрощает ADL, и вы можете использовать объявления для вставки конкретных имен в одно или другое пространство имен.
Псевдонимы пространства имен позволяют вам использовать более короткое имя для более длинного пространства имен в определенном контексте, что опять же позволяет более легкое использование:
Рассмотрим Boost, который имеет единственное корневое пространство имен, boost, а затем множество подпространств имен - boost :: asio, boost :: io, boost :: filesystem, boost :: tuples и т. Д. - для различных библиотек. Некоторые имена «повышаются» до корневого пространства имен:
Самое большое отличие от языков с «настоящими» модулями заключается в том, насколько распространено использование более плоской структуры, что в основном происходит потому, что так оно и работает, если только вы не приложите особых усилий для определения вложенных имен.
источник
У вас должно быть одно главное пространство имен для всего вашего кода. Это отличает его от внешнего кода в отношении пространств имен.
В пределах вашего основного пространства имен, в зависимости от размера и сложности, вы можете открывать подпространства имен. Здесь имена явно означают что-то в контексте, и одни и те же имена могут использоваться в другом контексте.
В частности, если у вас есть общее звучащее имя, такое как FileInfo, которое означает что-то конкретное в контексте, поместите его в пространство имен.
Вы также можете использовать класс для этого, хотя класс не является расширяемым, поэтому вы не можете добавлять новые объявления в класс без изменения его заголовка.
источник
Пространства имен не являются концепцией модуля, поэтому я буду использовать их только там, где могут возникнуть конфликты имен.
источник
У Java есть пространства имен, просто их так не называют. In
javax.swing.*
javax
является пространством имен иswing
является вложенным пространством имен. Я не читал книгу, чтобы узнать, что в ней говорится о пакетах java, но те же принципы применимы в значительной степени непосредственно к пространствам имен на любом языке.Хорошая эвристика заключается в том, что вы используете пространство имен, когда вы снова и снова хотите набирать один и тот же префикс для классов. Например, я недавно написал несколько классов под названием OmciAttribute, OmciAlarm, OmciMe и т. Д. И понял, что мне нужно разбить Omci на его собственное пространство имен.
источник
Мне нравятся глубокие пространства имен (что обычно означает три уровня).
В зависимости от ситуации у меня может быть еще один уровень
источник