我正在开发一个应用程序,用于将用户上传的图像/文档的数据库和目录从我们的生产服务器传输到开发服务器.该应用程序是用Coldfusion编写的,但我不认为该语言与这个问题相关 – 它更多
我将为我的示例编写伪代码,所以请不要选择语法.
当我看到类继承演示时,它通常是类似Student扩展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类以便我可以直接访问属性是否合适?导出类不是更专业的站点,就像我之前给出的Person / Student示例一样.相反,他们只是为Site类执行繁重的工作.
如果这不是适合继承的情况,我应该如何构建应用程序?正如我之前所说,我现在正在做的方式有效,但我想借此机会更多地了解设计模式,并以有意义的方式编写代码.
当某事物是另一种事物时,应该使用继承.就像狗是一种动物,因此它应该继承动物.
导出不是一种站点,因此它不应该继承它.
您正在寻找的是Composition. Export应该保留对它导出的站点的引用.然后,您可以在构建时将Site对象传递给它,并且可以在需要时从站点获取数据.