Класс просто для семантики - PullRequest
       7

Класс просто для семантики

0 голосов
/ 07 сентября 2011

Я создаю приложение, которое позволяет применять стили к регулярным выражениям и их группам захвата. У меня есть класс с именем RegexGroup, который содержит список RegexGroup и Regex.

Я сделаю графический интерфейс для использования этих классов, и я начал с создания класса Project, который будет сериализуем, но я понял, что класс Project будет точно таким же, как RegexGroup. Хорошо или плохо создавать класс Project, который точно такой же, как другой, только потому, что он будет использоваться в разных контекстах? Или я должен просто придерживаться класса RegexGroup? Заранее спасибо, эл.

примечание: я не мог придумать название, пожалуйста, исправьте меня, если слово "семантика" неверно

примечание: в настоящее время я пишу это в Java, но будет ли это подходящим использованием typedef в c ++?

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

Ответы [ 4 ]

1 голос
/ 07 сентября 2011

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

Я думаю, в Java, вы можете создать подкласс вашего проекта из RegexGroup и затем оставить тело проекта пустым.

Да, в C ++ вы можете использовать typedef.Или вы не можете: реализация зависит от того, хотите ли вы получить ошибку компилятора всякий раз, когда вы пытаетесь передать RegexGroup функции, которая ожидает Project, или нет.

1 голос
/ 07 сентября 2011

Если проект на самом деле RegexGroup. Тогда вы могли бы просто извлечь из этого.
Это имеет смысл, если вы говорите что-то другое, то вот откуда вы извлекаете это.

class Project: public RegexGroup { }

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

И да, в c ++ вы можете просто использовать typedef для объявления другого псевдонима того же типа.

typedef RegexGroup Project;
0 голосов
/ 07 сентября 2011

Если классы используются в разных контекстах, я бы определенно создал отдельный класс.В частности, я бы избегал повторного использования через наследование (наследование реализации) из-за следующего сценария:

class Regex { ... };
class RegexGroup
{
    public void add ( Regex pattern ) { ... }
    public void add ( RegexGroup group ) { ... }
}

class Project extends RegexGroup { ... }

// later on.
Project project = ...;
RegexGroup group = ...;
group.add(project);

Если последняя строка не имеет смысла для вашего приложения, то она нарушает LiskovПринципа замены и наследования следует избегать.

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

class Project
{
    private RegexGroup rootGroup;
    public void add ( Regex pattern )
    {
        this.rootGroup.add(pattern);
    }
    public void add ( RegexGroup group )
    {
        this.rootGroup.add(group);
    }
}

Для переадресации вызовов требуется немного дополнительного кода, но, вероятно, наиболее естественно моделируется структура приложения.

0 голосов
/ 07 сентября 2011

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

...