类设计: file conversion logic and class design

标签 class constructor

这是非常基本的问题,但也是一个普遍问题,所以我想听听人们的想法。我遇到的情况是,我需要获取现有的 MSI 文件并通过一些标准修改对其进行更新,然后生成一个新的 MSI 文件(复制旧文件并进行更改)。

我开始使用一些公共(public)方法和原始 MSI 的基本输入路径来编写此内容。问题是,为了使其正常工作,调用者必须遵循严格的调用路径:

var custom = CustomPackage(sourcemsipath);
custom.Duplicate(targetmsipath);
custom.Upgrade();
custom.Save();
custom.WriteSmsXmlFile(targetxmlpath);

将所有转换逻辑作为构造函数的一部分而不是将它们作为公共(public)方法提供会更好吗? (为了避免调用者必须知道“正确的顺序”是什么):

var custom = CustomPackage(sourcemsipath, targetmsipath); // saves converted msi
custom.WriteSmsXmlFile(targetxmlpath); // saves optional xml for sms

构造函数将直接复制 MSI 文件,升级它并将其保存到目标位置。 “WriteSmsXmlFile 仍然是一个公共(public)方法,因为它并不总是必需的。

就我个人而言,我不喜欢让构造函数实际“做一些事情” - 我更喜欢能够调用公共(public)方法,但假设调用者应该知道正确的调用顺序似乎是错误的?

另一种方法是首先复制文件,然后将复制的文件传递给构造函数 - 但最好让类自己执行此操作。

也许我把一切都搞反了,需要两个类:SourcePackageTargetPackage,并将 SourcePackage 传递到 TargetPackage 的构造函数中?

最佳答案

我同意你的第一个想法:将所有转换逻辑放在一个地方。没有理由向用户公开该序列。

顺便说一句,我同意你关于不要将操作放入构造函数中的观点。我可能不会在构造函数中执行此操作,而是在单独的转换器方法中执行此操作,但这是个人喜好。

关于类设计: file conversion logic and class design,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444058/

相关文章:

python - 类 lambda 回调 NameError

C++ 类对象指针和访问成员函数

scala 类构造函数和抽象类型

c++ - 在构造函数中初始化变量

c++ - 我可以像使用父类指针一样使用继承的类指针吗?

java - 无法让此类在客户端代码上的 java 中工作 - 没有编译错误,但运行时错误

不同文件之间二维矩阵的c++下标运算符

C++ 11 vector 构造函数复制与范围?

constructor - 构造函数如何使用复杂的算法初始化最终字段?

Android 全局/常用函数