首页 > 解决方案 > 这是在中型项目中实现封装的有效 OOP 替代方案吗?

问题描述

我是一名计算机科学专业的学生,​​在我最近的一个项目中,我一直在处理构建一个简单的应用程序,这可能是大/中型编程的一个例子。它的第一个实现将是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中有另一个函数来使用每个子类函数。这确实意味着所有实现都是私有的,并且允许完全更改AB的实现,但它要求每个操作都在C中“复制” 。

(这就是我想要得到答案的!)

但是,按原样,它不适合 MVC。我将无法回滚到典型的 OOP 方式(get-set-clone),所以我只想问是否可以制作一个接收已处理数据的控制器(如上所示),或者它是否会产生更多感觉将query1(例如)移出 cc 并将内部逻辑传递给控制器​​,将do2_through_C(C c) 和 do4_through_C(C c)添加到C API。

标签: coopencapsulation

解决方案


推荐阅读