这是非常基本的问题,但也是一个普遍问题,所以我想听听人们的想法。我遇到的情况是,我需要获取现有的 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)方法,但假设调用者应该知道正确的调用顺序似乎是错误的?
另一种方法是首先复制文件,然后将复制的文件传递给构造函数 - 但最好让类自己执行此操作。
也许我把一切都搞反了,需要两个类:SourcePackage、TargetPackage,并将 SourcePackage 传递到 TargetPackage 的构造函数中?
最佳答案
我同意你的第一个想法:将所有转换逻辑放在一个地方。没有理由向用户公开该序列。
顺便说一句,我同意你关于不要将操作放入构造函数中的观点。我可能不会在构造函数中执行此操作,而是在单独的转换器方法中执行此操作,但这是个人喜好。
关于类设计: file conversion logic and class design,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444058/