Я студент по информатике, и в одном из моих недавних проектов я имел дело с созданием простого приложения, которое, возможно, является примером большого / среднего программирования. Его первая реализация будет на C языке, а затем мы восстановим его на Java.
Это заставило меня усомниться в принципах OOP о инкапсуляция и как ее достичь, а также как спроектировать систему с помощью архитектуры MVC.
Без лишних слов, вот моя проблема в очень упрощенном виде:
Допустим, у меня есть следующие два класса:
a.h
typedef struct a *A;
void insert_into_a(A a, something_to_insert s);
void do1(A a);
stuff do2(A a);
b.h
typedef struct b *B;
void insert_into_b(B b, something_to_insert s);
void do3(B b);
some_value do4(B b);
Примечание: Мне известно, что скрытые указатели могут подвергаться критике, но это было предложено сделать, поэтому, пожалуйста, игнорируйте этот факт.
Эти два класса являются частями одной и той же конечной цели, но не имеют прямого отношения. Поэтому меня интересует, как построить третий, C класс , который будет взаимодействовать с этими двумя без нарушения инкапсуляции. Этот класс C должен иметь возможность загружать подклассы (A и B) и выполнять запросы к ним (он действует как база данных), и это был мой подход:
c.c
struct c{
A a;
B b;
};
void insert_into_a_through_c(C c, something_to_insert s){
insert_into_a(c->a, s);
}
void insert_into_b_through_c(C c, something_to_insert s){
insert_into_b(c->b, s);
}
something query1(C c){
/* Get some info from subclass */ stuff s = do2(c->a);
/* Get some info from subclass */ some_value sv = do4(c->b);
/* do some other things with s and sv */ something some = something_with_s_and_sv(s, sv);
return some;
}
Итак, я никогда не нарушаю инкапсуляцию, потому что я не позволяю пользователю когда-либо иметь что-либо на руках. Если вы хотите поместить что-то в A, вы делаете это через C. И все это было неплохо, пока я не попытался перейти на архитектуру MVC, а затем я понял следующее ...
Это не C, который должен задавать вопросы самому себе, это задача контроллера, который должен анализировать, извлекать данные, действовать на них и передавать их в представление. Итак, я подумал об исправлении этого, но потом это поразило меня. Для этого мне понадобится еще одна функция в C для использования каждой из функций подклассов. Это означает, что вся реализация является частной и позволяет полностью изменить реализацию A и B , но требует, чтобы каждое действие было «продублировано» в C.
(Это то, для чего я хочу получить ответ!)
Но, как есть, оно не может соответствовать MVC. Я не смогу вернуться к обычному способу OOP (get-set-clone), поэтому я просто хотел спросить, можно ли создать контроллер, который получает уже обработанные данные (как вы видите выше) или если имеет смысл переместить query1 (например) из c. c и передать внутренний лог c в контроллер, добавив do2_through_ C (C c) и выполните do4_through_ C (C c) до C API.