我正在开发一个应用程序,用于将用户上传的图像/文档的数据库和目录从我们的生产服务器传输到开发服务器。该应用程序是用 Coldfusion 编写的,但我认为该语言与该问题无关 - 它更多的是结构/体系结构问题,而不是特定于该语言的问题。
我将为我的示例编写伪代码,因此请不要拆开语法。
当我看到类继承的演示时,它通常很简单,例如 class Student extends Person() {}
。显然,学生是一个更专业的人,所以这是有道理的。
在我的应用程序中,我有一个类 Site()
,其中包含相关信息,例如 DSN、文件上传目录等。我在一个类中执行 SQL 导出,并在一个类中执行文件上传导出另一个类,这两个类都是从站点类中调用的(伪代码):
class Site {
public function exportSql() {
sqlExport = new sqlExport(this.dsn);
sqlExport.createDumpAndZipItAndStuff();
}
public function exportUploads() {
uploadsExport = new uploadsExport(this.uploadDirectory);
uploadsExport.copyAndZipFilesAndStuff();
}
}
Site 类除了控制应用程序前端请求的流量之外不执行任何其他操作,其他所有内容都将交给导出类之一。
这对我来说效果很好,但我想正确构建它。现在,我必须将 Site 的属性传递给导出类的构造函数,然后使用这些参数设置导出类的属性。这会导致大量重复。
让我的导出类继承 Site 类以便我可以直接访问属性是否合适?导出类并不是一个更专业的站点,如我之前给出的“人员/学生”示例中所示。相反,它们只是执行 Site 类的繁重工作。
如果这不适合继承,我应该如何构建应用程序?正如我之前所说,我现在的做法有效,但我想借此机会了解有关设计模式的更多信息,并以有意义的方式编写代码。
最佳答案
当某事物是另一事物时,应该使用继承。
就像狗是动物一样,因此它应该继承自动物。
Export 不是一种 Site,因此它不应该继承它。
您正在寻找的是 Composition 。 导出应包含对其导出的站点的引用。然后你可以在构造时将 Site 对象传递给它,它就可以在你需要时从站点获取数据。
关于oop - 我应该如何构建这个类的继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6049921/