x0rHamster
@x0rHamster
full stack web- и c#-разработчик

Именование классов?

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


Несколько примеров классов, с именами которых возникает проблема (прошу прощения за дурацкие примеры):

— Лилия, наследуемая от цветка (B, наследуемый от A)

— Лепесток, который может быть только у лилии (C, который используется только в B)

— Лист, который может быть и у лилии, и у цветка вообще (D, который используется и в B, и в A)

— Тычинка, которая может быть и у лилии, и у мака, но необязательно она есть у цветка вообще (E, который используется и F (который, в свою очередь, наследуется от A), и в B, но в A он не используется)

И крайний случай: есть квартира, в которой есть какая-то красивая фигня. Лилию, в принципе, можно использовать в качестве красивой фигни. Как назвать адаптер «Лилия as Красивая фигня», чтобы он не потерялся среди всех классов (т.к. теоретически он принадлежит группе «квартира», но также зависит и от группы «цветы»)? Абстрактно — есть G, которая использует H; как назвать I, который ползволяет использовать B как H?


Заминка возникла из-за строго иерархической файловой системы и привычки называть классы a-la папки (т.е. Fuston_Http_Response_Cookie_Marked). Эта привычка как раз и не дает ответа на вопрос «как назвать интерфейс, который позволит Testing_Database_Cache_Cookies использовать посторонний класс Fuston_Http_Response_Cookie как свой собственный Testing_Database_Cache_Cookies_Cookie?».
  • Вопрос задан
  • 9279 просмотров
Пригласить эксперта
Ответы на вопрос 5
@shagguboy
используй неймспейсы.
namespace Tickets\LkBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
Ответ написан
@niko83
Подумайте не о том как класы назвать, а о том как этим всем пользоваться.
Подумайте в первую очередь об интерфейсах. В вашем случае, на мой взгляд, нужно частично отказаться от наследования и использовать стратегию. Для пораждения объекта использовать паттерн фабрика.
Ответ написан
taliban
@taliban
php программист
1. Ни в коем случае не именуйте классы Родитель_дите_ итд
2. Используйте неймспейсы, это избавит от уродских названий
3. Посмотрите на именование классов в зенде (пире), логика тамошних названий говорит сама за себя
Если будете держаться этих трех пунктов, то никогда не потеряетесь =) и названия будут красивые и структурная логика будет всегда понятна.
Ответ написан
Shedal
@Shedal
class Leaf {} // лист

class Thorn {} // шип (т.к. тычинка вроде как у всех цветковых есть)

class Flower // цветок
{
    Leaf[] leaves;
}

interface Thorny // с шипами
{
    Thorn[] thorns;
}

class LilyPetal {} // лепесток лилии

interface CuteThing {} // красивая фигня

// лилия — шипастый цветок, да и к тому же, красивая фигня
class Lily : Flower, Thorny, CuteThing
{
    LilyPetal[] petals;
}

class Apartment // квартира
{
    CuteThing[] things;
}


По поводу именования файлов в стиле:
«как назвать интерфейс, который позволит Testing_Database_Cache_Cookies использовать посторонний класс Fuston_Http_Response_Cookie как свой собственный Testing_Database_Cache_Cookies_Cookie?»
… то непонятно, зачем это вообще нужно. Особенно учитывая, что зачастую это невозможно.
Название класса должно кратко описывать сущность, а не говорить об особенностях внутреннего устройства.
Ответ написан
1. У меня создалось впечатление, что тут наследование перепутано с делегированием. Если у разных объектов, которые не участвуют в наследственности(т.е. по-хорошему комната и листок не должны иметь общих предков), должны быть общие методы — то тут есть несколько путей развития: примеси, делегирование специального объекта с общим поведением в объекты. А, если реализация простая, то для каждого супер-класса можно написать свою реализацию.

2. Лучше классы называть понятно. Может стоит извратиться, написать небольшой скрипт, который сканирует файлы классов и создаёт массив: array('class_name'=>'class_file', ...)? Можно такое сделать только для этой части проекта и зарегистрировать для него отдельный автозагрузчик.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы