Является ли это действительной альтернативой OOP для достижения инкапсуляции в проектах среднего масштаба? - PullRequest
2 голосов
/ 06 апреля 2020

Я студент по информатике, и в одном из моих недавних проектов я имел дело с созданием простого приложения, которое, возможно, является примером большого / среднего программирования. Его первая реализация будет на 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.

...