Суть этого вопроса в том, чтобы расширить класс, свести к минимуму переполнение всего в один класс и максимизировать повторное использование кода.После прочтения этого вопроса, пожалуйста, не стесняйтесь редактировать заголовок или описание, чтобы сделать его более кратким.Хотя пост выглядит длинным, я просто пытаюсь быть тщательным, используя множество примеров.
Предположим, у меня есть класс:
class UsedByManyPeople
{
// ...has many fields
};
Как следует из названия, этот класс используетсямногими разработчиками.Мне нужно добавить 2 функции в этот класс:
- a convert (), который преобразует UsedByManyPeople в SomeOtherType
- getFileName (), который возвращает строку
Оба они соответствуют потребностям моего отдела.
Решение с первой попытки
Сначала я подумал о простом добавлении 2 новых методов в UsedByManyPeople. Таким образом, класс теперь будет выглядеть следующим образом:
class UsedByManyPeople
{
// ...has many fields
public:
SomeOtherType const convert() const;
std::string const getFileName() const;
};
Однако эти 2 функции на самом деле являются специфическими для случая использования моего отдела, а другие отделы даже не имеют определения класса SomeOtherType и не заботятся о getFileName ().
Понятно, что вышеприведенный подход не является хорошим подходом (?).
Как бы вы расширили этот класс?
Альтернативы, которые пришли мне в голову:
Подкласс UsedByManyPeople и создайте свой собственный класс.
- Свяжите данные и метод вместе
Например,
class ExtUsedByManyPeople : public UsedByManyPeople
{
public:
SomeOtherType const convert() const;
std::string const getFileName() const;
};
Создание вспомогательных классов, по одному для каждогометод (yikes!) и реализуйте его как статические методы.
- Отделите данные от методов, ответственность за один класс
Например,
class UsedByManyPeopleToSomeOtherTypeConverter
{
public:
static SomeOtherType const convert(UsedByManyPeople const&);
};
class UsedByManyPeopleFileName
{
public:
static std::string const getFileName(UsedByManyPeople const&);
};
Создайте один класс Helper со всеми методами внутри.
- Отдельные данные от методов, один класс, много обязанностей
Например,
class UsedByManyPeopleHelper
{
public:
static SomeOtherType const convert(UsedByManyPeople const&);
static std::string const getFileName(UsedByManyPeople const&);
};