c - 这是在中型项目中实现封装的有效 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中有另一个函数来使用每个子类函数。这确实意味着所有实现都是私有的,并且允许完全更改A和B的实现,但它要求每个操作都在C中“复制” 。
(这就是我想要得到答案的!)
但是,按原样,它不适合 MVC。我将无法回滚到典型的 OOP 方式(get-set-clone),所以我只想问是否可以制作一个接收已处理数据的控制器(如上所示),或者它是否会产生更多感觉将query1(例如)移出 cc 并将内部逻辑传递给控制器,将do2_through_C(C c) 和 do4_through_C(C c)添加到C API。
解决方案
推荐阅读
- c# - 我如何添加一行来告诉代码我希望平台在关卡循环完成后加速/
- python - TensorFlow 将数组处理为 feature_columns
- trace - JFR.dump 失败。“在指定的时间间隔内没有数据”
- vue.js - 如何最好地创建一个可以处理多个访问权限的 Vue vue-cli 应用程序
- xaml - 如何以两种方式绑定到 UserControl DependencyProperty?
- sql-server - SQL Server:从表中删除
- css-selectors - Puppeteer 如何单击“下一个兄弟”的子元素
- javascript - 每次安装 npm 都会发生此错误:“npm ERR!无法读取未定义的属性 'resolve'。”
- shell - 在 shell 中访问 hiveconf 变量
- docker - Docker 容器未使用最新的 composer.json 文件