Итак, я некоторое время писал это программное обеспечение на 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 (..);
Итак, что бы вы предложили мне сделать здесь? Я могу построить этот мастер-класс до бесконечности, но я уверен, что есть лучший способ. Как эти вещи решаются в реальных приличных размерах кода? Могу ли я быстро выполнить рефакторинг кода для всего проекта, чтобы сделать эти радикальные изменения без проблем?
Как любезно ссылается @Mat в комментариях, вы оказались в сопровождении так называемого «объекта Бога» — он управляет каждой вещью в вашем проекте, и любое изменение кода будет влиять на этого «Бога».
Пока у вас есть некоторый опыт разработки, может быть стоит почитать несколько рекомендаций:
В этом случае исправление выглядит довольно просто. Просто бросьте весь мастер-класс. Это не добавляет никакой ценности, так что нечего его приобретать.
Ваш FILE CHANNEL
или же namespace file
уже существует, и называется class FileWriter
,
Я немного подозрительно filename
аргумент. Это, вероятно, не должно присутствовать в write
метод, который должен быть передан FileWriter
конструктор. У каждого файла должен быть свой писатель.