答案 0 :(得分:1)
我同意Jaroslav - 我希望通过IApiService接口访问各种实例属性。
(好吧,我的C#生锈了 - 在C ++中我通过在IApiService接口上调用set / getProfilePhoto方法来访问IPhoto接口。)
接下来,您的所有示例都涉及Facebook特定的类,而我希望它们是用通用接口(IPhoto,IApiSession等)编写的。
如果没有这些抽象,你就没有可插拔的解决方案,这似乎是要求。
答案 1 :(得分:0)
关于你的界面IApiService
,对Seb Rose和Jaroslav所说的内容进行了扩展。
使用界面的好处是:如果您的工厂给我(客户端代码)IApiService
,我不需要知道哪个 IApiService
我为了使用它。
但是,在您的模型中,IApiService
没有检索照片的方法。如果我想要一张照片,我必须找出它真正的IApiService
(Facebook),并访问FacebookAlbumPhoto
或FacebookProfilePhoto
。因为客户端正在与FacebookPhotoService
而不是IApiService
的方法进行交互,所以它会破坏界面的目的。
这并不是说它很容易修复。如果您想真正充分利用界面,则必须设计IApiService
的方法和属性,这些方法和属性可用于您计划的所有照片服务。也许你选择通过像IEnumerable<IPhoto> GetAllPhotos()
这样的方法来拍照,而牺牲了个人资料和专辑照片之间的(特定于Facebook)区别......(你总是可以检查得到的IPhoto
个看看他们是FacebookAlbumPhoto
,但你想避免这种情况,直到有必要......)
或者你可能认为有一个方法IPhoto GetProfilePhoto()
是有价值的,但是你意识到某些服务可能没有个人资料照片,所以他们会返回null
(或者集合中的第一张照片,或者对于特定服务似乎正确的任何东西)。也许您添加IEnumerable<string> GetTags()
和IEnumerable<IPhoto> GetPhotosByTag(string Tag)
,如果您的某个服务使用的是“类别”而不是“标记”,则可以隐藏这种区别。
您已经提供了很多关于您的架构的详细信息,但是需要有关项目目标的更多信息才能真正帮助权衡这些选项。
(另外请注意,你必须做出选择并且面向未来永远不会100%。如果这将是未来12个月的Facebook,你现在可以将其写为特定于Facebook并在以后重构一个优点是,从现在起一年后,您将比现在更了解您的应用程序及其不断发展的需求。嘿,也许您需要集成的下一个大型照片服务今天甚至不在线!)< / p>