java - 代码可读性/习惯做法/设计模式?
问题描述
我一直在分析一些可以这样总结的类:
public class RulerFather {
private Girl girl;
private Pet pet;
public RulerFather()
{
girl = new Girl(this);
pet = new Pet(this);
}
/*
* allowed messages between Girl and Pet
*/
public feedPet()
{
pet.receiveFood();
}
public lickGirl()
{
girl.beLicked();
}
}
public class Girl {
Father father;
public Girl(Father father)
{
this.father = father;
}
...
父亲实例化了女孩和宠物,并定义了可以交换的允许消息。例如,在 Girl 的代码中,她可以通过以下方式喂养宠物(向宠物发送消息):
father.feedPet();
我的意思是,由父亲创建的对象可以交换消息,但只能使用父亲提供的方法,所以父亲是一种“统治者”,定义允许在它们之间交换哪些方法(在那个交互级别)。
我的问题是,在我分析的代码中,我看到了上述和另一种方式之间的混合,这种方式只是将女孩和宠物的引用公开而不是私有(这会导致自由和一些混乱,因为女孩可以调用任何方法pet,在某种程度上,RulerFather 在 RulerFather 创建的对象范围内定义了女孩和宠物之间的许多有效交互)。
这与任何推荐的编码实践有关吗?(或者甚至是我不知道的设计模式?)
解决方案
这是一种有趣的方法,尽管会导致几个问题:
- 循环依赖:父类知道两个子类,反之亦然。所以这三个组成了一个非常奇怪的三角形
- 隐式耦合:女班明白有个爸爸大概养了一只宠物
然而,这是减少接口的一种方式。有时,您最终会得到无法更改的遗留类,但它为新用途提供了太多方法。然后,您需要一种合理的方式来提供缩小“范围”的视图。但是这种方法通过某种方式复制代码来工作:父类定义了它自己的接口!
除此之外,我在这里不认识特定的模式。
为了缓解我提到的问题,您肯定会考虑使用接口。所以所有的类都应该实现自己的接口,没有一个实现类对其他实现类一无所知。也许除了必须知道要为不同的接口类型实例化哪些 impl 类的代码之外。
推荐阅读
- flutter - Flutter - 当我推送的页面被后退按钮弹出时如何得到通知?
- windows - 如何在 Windows 上创建每用户服务?
- scheduled-tasks - 为什么即使我通过设置 `spark.sql.shuffle.partitions` 更改默认配置,结构化流式处理的阶段大多有 200 个任务?
- openssl - 匿名密码不适用于 OpenSSL1.1.1-D
- amazon-web-services - AWS Glue Cloudformation 排除模式 排除:字符串
- java - 动态根元素 JAXB?
- python - 如何在 python 中的 elasticsearch 中索引大型 json 响应?使用 Elasticsearch DSL
- javascript - React-parent 组件正在输入子项的值 1 个字符丢失
- javascript - 当 Store 在 Reducer 中发生更改时,useSelector 不会更新。ReactJS Redux
- android - 如何从apk文件中获取url?