Является ли хорошей практикой убедиться, что все абстрактные классы имеют имена с префиксом «Абстрактные»?Должен ли я называть все мои абстрактные классы AbstractFoo
ответ
Вы можете, но я стараюсь не делать этого, поскольку это деталь реализации.
Мне не нравится добавлять подробную информацию о реализации в имена типов и идентификаторов, поскольку такая информация может измениться в будущем. На мой взгляд, лучше всего назвать вещи такими, какие они есть, а не то, как они реализуются.
Это зависит от ваших правил кодирования.
Вы также можете назвать их FooBase или просто Foo, если у вас еще нет интерфейса Foo.
FooBase - привлекательная альтернатива –
Если вы рассматриваете, как это делается в .NET Framework, нет. Возьмем, к примеру, абстрактный класс Stream. Ничто в названии класса не указывает, что оно фактически абстрактно.
Мне так полезно назвать классы таким образом. Он отправляет сообщение о том, что они предназначены для подкласса; не инстанцируется; содержат код, общий для подклассов и т. д.
Это не всегда необходимо. Большинство программистов, вероятно, идентифицируют «форму» как абстрактный класс и «квадрат», «круг» и т. Д. Как конкретные. Но если это не сразу понятно, это полезный намек.
Вы также должны руководствоваться местными соглашениями по программированию и руководствами по стилю.
Я думаю, отчасти это зависит от того, как вы будете использовать класс. Если он предназначен только для внутреннего использования, чтобы заставить производные классы соответствовать интерфейсу, добавив Abstract, прежде чем это может быть плохой идеей. Однако, если вы предоставляете фабрику Foo, которая будет предоставлять экземпляры Foo, которые на самом деле являются SpecializedFoo1 или SpecializedFoo2, то неудобно возвращать экземпляры AbstractFoo.
Я думаю, что это соглашение об именах используется только потому, что трудно найти другое доброе имя. Если у вас уже есть интерфейс под названием «Список», как можно назвать класс «AbstractList»? Это больше об избежании конфликтов имен, а затем о деталях реализации.
Это точка, которая слишком часто уходит из этой беседы и, возможно, самая важная из всех. Кроме того, это приводит к нерешительности: иногда вы можете найти хорошее альтернативное имя для супер-абстрактного класса. В других случаях вы не можете. Смешиваете ли вы стили в рамках одной и той же области проекта? – crush
Kinda трудно объяснить, но я использую его только для того, чтобы избежать копирования и вставки одного и того же кода в функциональные классы, а не в нечто вроде объектов домена.
- AbstractServiceTestCase -> Конспект префикс кажется полезным
- AbstractAnimal -> Кажется странным и бесполезным
Вы должны конечно решить для себя, до тех пор, как же конвенции следует на протяжении всего проекта ,
Ответы до сих пор очень полезны и показывают ответственное распространение практики. Я склонен согласиться с тем, что имена не должны указывать на реализацию (Foo
может быть абстрактным классом, который позже был перенесен в интерфейс). Однако это полезно для меня, когда кодирование имеет визуальные подсказки, которые мне необходимы для предоставления методов для производных классов.
В качестве примера у меня в настоящее время есть иерархия (не спрашивайте об обосновании имен, но они имеют смысл в контексте и отображают имена XML-элементов).Я использую Java, но я думаю, что большинство языков будут похожи:
public abstract class Marker {...}
public class Template extends Marker {...}
public class Regex extends Marker {...}
Я сейчас тенденция к:
public abstract class Marker {...}
public class TemplateMarker extends Marker {...}
public class RegexMarker extends Marker {...}
вместо
public abstract class AbstractMarker {...}
public class Template extends AbstractMarker {...}
public class Regex extends AbstractMarker {...}
или
public abstract class AbstractMarker {...}
public class TemplateMarker extends AbstractMarker {...}
public class RegexMarker extends AbstractMarker {...}
Я лично помню, что Marker
- абстрактная функциональная концепция и что подклассы представляют собой конкретные реализации.
Я бы не стал называть абстрактные классы Абстрактным по следующей причине:
Каждых Прямоугольником является Формой. Всюду вы можете использовать фигуру, вы можете использовать прямоугольник. Код, который имеет дело с прямоугольником (но может также иметь дело с кругами) может выглядеть следующим образом:
Shape s = .....;
s.drawTo(myGraphicsContext);
Использование объекта (например, прямоугольник) в любом месте вы можете использовать обобщение этого (например, Shape) является важным часть объектно-ориентированной концепции и известная как Liskov Substitution Principle. (Также очевидно: какое предложение или логика будет делать заявления о фигурах, но тогда не применимы к прямоугольникам?)
Если вы назвали обобщение AbstractShape, этот принцип нарушен. Прямоугольник не является AbstractShape. Если что-нибудь, это «Бетонная форма»! Прямоугольник не абстрактный (в смысле «Я не знаю, какой тип формы это. Может быть прямоугольником, может быть что-то еще»). Код, использующий AbstractShape затем читает неправильно:
AbstractShape s = new Rectangle(...);
Я с большим блоге мысли на эту тему here.
Форма будет интерфейсом, в то время как AbstractShape будет абстрактным классом. 'class Rectangle extends AbstractShape' и' class AbstractShape реализует Shape'; или 'class Rectangle extends AbstractShape реализует форму'; что лучше всего подходит для вашего сценария. – crush
- 1. Должен ли я использовать абстрактные классы?
- 2. Должен ли я реализовывать все абстрактные методы в python 2.7?
- 3. Должен ли я называть Close() на ServiceController?
- 4. Имеет ли абстрактные классы VTABLE?
- 5. Должен ли я называть `executorService.shutdown` и` executorService.awaitTermination`?
- 6. Зачем использовать абстрактные классы
- 7. Векторы и абстрактные классы
- 8. Должны ли мы классы JavaDoc расширять абстрактные классы?
- 9. Когда использовать абстрактные классы?
- 10. Абстрактные классы, расширяющие классы бетона
- 11. Абстрактные классы и бетонные классы
- 12. Абстрактные классы и Конструкторы
- 13. Абстрактные классы в Java
- 14. Дерево и абстрактные классы?
- 15. абстрактные классы и шаблоны
- 16. Абстрактные классы и дженерики
- 17. Существуют ли чистые абстрактные классы в C++?
- 18. Абстрактные классы и числа
- 19. Абстрактные классы или частичные?
- 20. частные интерфейсы или абстрактные классы: каковы мои варианты
- 21. Должен ли я передать все мои ассоциации отношений?
- 22. Должен ли я разрешать все мои зависимости на корневом уровне?
- 23. Должен ли я поймать все мои исключения в global.asax?
- 24. Должен ли я сделать все мои java-коды потокобезопасными?
- 25. Ext.Loader Синхронная загрузка. Должен ли я Ext.require() все мои магазины?
- 26. Абстрактные классы - Суперконструктор (Java)
- 27. JAXB и абстрактные классы
- 28. В Joomla, где я должен поместить мои классы, которые вычисляют?
- 29. Почему нужны абстрактные классы?
- 30. C++ Абстрактные классы и создание производных классов
Этот вопрос составлен в книгах, таких как Clean Code, и я склонен согласиться. –