Как правильно организовать код в корневом классе?

Итак, я некоторое время писал это программное обеспечение на C ++. У него есть графический интерфейс, а графический интерфейс имеет доступ к объекту мастер-класса, этот объект отвечает за любую задачу, выполняемую графическим интерфейсом (когда пользователь что-то щелкает, графический интерфейс пользователя просто вызывает метод этого объекта).

Теперь я не знаю, является ли это лучшим способом. Я никогда не работал ни в одной компании, занимающейся кодированием, но у меня возникли некоторые проблемы.

На самом деле, мастер-класс ничего не делает. В основном это оболочка для других объектов, находящихся внутри этого класса. Так, например:

class Master {
public:
void writeSomethingToFile(const char *filename,std::string& text);
...
}

под капотом:

class Master {
...
private:
FileWriter *_writer;
}

void Master::writeSomethingToFile(const char *filename,std::string& text) {
_writer->write(filename,text);
}

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

Мастер-класс имеет много объектов, таких как класс Writer, поэтому, что касается графического интерфейса, мастер-класс способен на ВСЕ, что ему когда-либо понадобится в программе.

Тем не менее, код get выглядит неуклюже в мастер-классе, так как он содержит все эти методы-обертки и имеет ОЧЕНЬ МНОГО МЕТОДОВ.

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

То, что я сейчас использую, очень примитивно, и я ни в коем случае не защищаюсь так:

class Master {
public:
// FILE CHANNEL
void writeToFile(...);
void deleteFile(...);
// FILE CHANNEL

// ARITHMETIC CHANNEL
void addNumbers(...);
void multiplyNumbers(...);
// ARITHMETIC CHANNEL

...
}

Я бы буквально разделил то, что я называю «каналами», с комментариями, чтобы понять, что к чему относится. Теперь для графического интерфейса это может быть не так уж и плохо, поскольку все сгруппировано. Тем не менее, когда я продолжаю развивать этот класс, добавляя в него новые внутренние классы и добавляя больше методов, материал становится неуклюжим, и, что меня больше всего беспокоит, это не очень хорошо. Я имею в виду, если бы я взял один метод из прокомментированного «канала» и вставил его в другой, действительно ли я увидел бы разницу?

Я думал о паре решений. Я никогда не пробовал, но я могу создать члены:

class Master {
public:
namespace file {
void writeToFile(...);
void deleteFile(...);
}

namespace arithmetic {
void addNumbers(...);
void multiplyNumbers(...);
}

...
}

Это решает проблему с моей стороны, как разработчика класса, но для графического интерфейса они теперь должны вызывать такие методы, как

master->arithmetic.addNumbers(...); // My syntax could be wrong here
// never used memberspace, corrections are appreciated

И теперь, так как мой проект в настоящий момент находится на стадии разработки, это будет означать изменение МНОГО КОДА.

Другое решение, о котором я думал, было постоянное наследование от класса к классу, где мастер-класс в файле фокусируется на одном канале:

class Master_fileChannel {
FileHandler *_fileHandler;
void writeToFile(...);
void deleteFile(...);
}

...

class Master_arithmeticChannel : public Master_fileChannel {
ArithmeticUnit *_arithmeticUnit;
void addNumbers(...);
void multiplyNumbers(...);
}

и так далее, пока я не унаследую каждый «канал». Это будет более надежным, чем исходное состояние, и сделает файлы намного короче, чем текущий .cpp файл для этого класса. Но у меня все еще была бы проблема, заключающаяся в том, что я мог бы использовать повторяющиеся имена методов, и мне приходилось бы придумывать все больше неуклюжих имен для своих методов (т.е. addNumbers (..); addThreadNumbers (..); addThreadNumbersSeparately (..);

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

0

Решение

Как любезно ссылается @Mat в комментариях, вы оказались в сопровождении так называемого «объекта Бога» — он управляет каждой вещью в вашем проекте, и любое изменение кода будет влиять на этого «Бога».

Пока у вас есть некоторый опыт разработки, может быть стоит почитать несколько рекомендаций:

2

Другие решения

В этом случае исправление выглядит довольно просто. Просто бросьте весь мастер-класс. Это не добавляет никакой ценности, так что нечего его приобретать.

Ваш FILE CHANNEL или же namespace file уже существует, и называется class FileWriter,

Я немного подозрительно filename аргумент. Это, вероятно, не должно присутствовать в write метод, который должен быть передан FileWriter конструктор. У каждого файла должен быть свой писатель.

0