- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了获得一些良好的 OO 设计的实践经验,我决定尝试在遗留应用程序上应用关注点分离。
我决定我不喜欢这些调用分散在整个代码库中。
ConfigurationManager.AppSettings["key"]
虽然我之前已经通过编写一个辅助类来将这些调用封装到静态方法中来解决这个问题,但我认为这可能是一个更进一步的机会。
我意识到最终我应该以使用依赖注入(inject)为目标,并且始终“编码到接口(interface)”。但我不想迈出看似太大的一步。与此同时,我想朝着这个最终目标迈出更小的一步。
Can anyone enumerate the steps they would recommend?
下面是一些我想到的:
让客户端代码依赖于接口(interface)而非具体实现
手动注入(inject)依赖到一个通过构造函数或属性接口(interface)?
在努力之前选择和应用 IoC容器 我如何保存代码运行?
为了满足默认的依赖任何需要的类的构造函数配置值可以使用工厂(使用静态 CreateObject() 方法)?
我肯定仍然对工厂有具体的依赖吗?...
我已经深入研究了 Michael Feathers' book所以我知道我需要引入接缝,但我很难知道我何时引入了足够多或太多!
更新
想象一下,客户端调用 WidgetLoader 上的方法并将所需的依赖项(例如 IConfigReader)传递给它
WidgetLoader 读取配置以找出要加载的 Widget 并要求 WidgetFactory 依次创建每个 Widget
WidgetFactory 读取配置以知道默认情况下将 Widget 置于什么状态
WidgetFactory 委托(delegate) WidgetRepository 进行数据访问,WidgetRepository 读取配置以决定它应该记录哪些诊断信息
In each case above should the IConfigReader be passed like a hot potato between each member in the call chain?
Is a Factory the answer?
澄清以下一些评论:
我的主要目标是逐渐将一些应用程序设置从配置文件中迁移出来,并以某种其他形式持久化。虽然我意识到通过注入(inject)的依赖项我可以 Extract and Override为了获得一些单元测试的好处,我主要关心的不是测试太多,而是封装得足够多,以至于开始不知道设置实际保存在哪里。
最佳答案
重构遗留代码库时,您希望随着时间的推移迭代地进行小的更改。这是一种方法:
使用获取应用设置的方法(即 GetAppSettingString( string key ))创建一个新的静态类(即 MyConfigManager)
全局搜索并替换“ConfigurationManager.AppSettings["key"] 并将实例替换为“MyConfigManager.GetAppSettingsString("key")”
测试和 checkin
现在您对 ConfigurationManager 的依赖位于一处。您可以将您的设置存储在数据库中或任何地方,而无需更改大量代码。不利的一面是您仍然具有静态依赖性。
下一步是将 MyConfigManager 更改为常规实例类,并将其注入(inject)到使用它的类中。这里最好的方法是逐步进行。
在静态类旁边创建一个实例类(和一个接口(interface))。
既然你已经拥有了这两者,你可以慢慢地重构 using 类,直到它们都在使用实例类。将实例注入(inject)构造函数(使用接口(interface))。如果有很多用法,请不要尝试大爆炸 checkin 。随着时间的推移,慢慢地、小心地做。
然后只删除静态类。
关于c# - 逐步应用更好的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1888719/
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
.NET 框架:4.5.1 我在 Blend for visual studio 2015 中遇到一个奇怪的错误,我找不到它的来源。 如果我在 VS 中打开我的 WPF 解决方案,它会加载并运行良好。
我经常遇到这样的问题,与 Hierarchical RESTful URL design 非常相似 假设该服务仅提供用户上传文档。 POST, GET /accounts PUT, DELETE /a
在 Rails 应用程序中,我使用 devise 来管理我的用户,而我用来销毁 session 的链接不再有效。它正在工作,现在我添加了事件管理员,但没有。 我的链接是 :delete, :clas
我已经坚持了超过 24 小时,试图按照此处发布的其他解决方案进行操作,但我无法使其正常工作。我是 Rails 新手,需要帮助! 我想让我的/users/edit 页面正常工作,以便我可以简单地更改用户
Devise 在以下情况下不会使用户超时: 用户登录,关闭选项卡,然后在超时 + X 分钟内重新访问该 URL。用户仍处于登录状态。 如果选项卡已打开并且稍后刷新/单击,则超时可以正常工作。这意味着
我想使用这样的 slider 我希望该 slider 根据提供给它的值进行相应调整。到目前为止,我只能应用具有渐变效果的背景,但无法获得这种效果。请通过提供样式代码来帮助我。
您应该为每种方法创建一个请求/响应对象,还是应该为每个服务创建一个? 如果我在所有方法中使用它,我的服务请求对象中将只有 5 个不同的东西,因为我对几乎所有方法使用相同的输入。 响应对象将只有一个字典
我正在尝试在 REST 中对实体的附件进行建模。假设一个缺陷实体可以附加多个附件。每个附件都有描述和一些其他属性(上次修改时间、文件大小...)。附件本身是任何格式的文件(jpeg、doc ...)
我有以下表格: Blogs { BlogName } BlogPosts { BlogName, PostTitle } 博客文章同时建模一个实体和一个关系,根据 6nf(根据第三个宣言)这是无效的。
如果 A 类与 B、C 和 D 类中的每一个都有唯一的交互,那么交互的代码应该在 A 中还是在 B、C 和 D 中? 我正在编写一个小游戏,其中许多对象可以与其他对象进行独特的交互。例如,EMP点击
关于如何记住我与 Omniauth 一起工作似乎有些困惑。 根据这个wiki ,您需要在 OmniauthCallbacksController 中包含以下内容: remember_me(user)
设计问题: 使用 非线程安全 组件(集合,API,...)在/带有 多线程成分 ... 例子 : 组件 1 :多线程套接字服务器谁向消息处理程序发送消息... 组件 2 :非线程安全 消息处理程序 谁
我们目前正在设计一个 RESTful 应用程序。我们决定使用 XML 作为我们的基本表示。 我有以下关于在 XML 中设计/建模应用程序数据的问题。 在 XML 中进行数据建模的方法有哪些?从头开始然
我正在设计一个新的 XSD 来从业务合作伙伴那里获取积分信息。对于每笔交易,合作伙伴必须提供至少一种积分类型的积分值。我有以下几点:
设计支持多个版本的 API 的最佳方法是什么。我如何确保即使我的数据架构发生更改(微小更改),我的 api 的使用者也不会受到影响?任何引用架构、指南都非常有用。 最佳答案 Mark Nottingh
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我想用 php 创建一个网站,其工作方式与 https://www.bitcoins.lc/ 相同。确实,就每个页面上具有相同布局但内容会随着您更改链接/页面而改变而言,我如何在 php 中使用lay
我有一个关于编写 Swing UI 的问题。如果我想制作一个带有某些选项的软件,例如在第一个框架上,我有三个按钮(新建、选项、退出)。 现在,如果用户单击新按钮,我想将框架中的整个内容更改为其他内容。
我正在尝试找出并学习将应用程序拥有的一堆Docker容器移至Kubernetes的模式和最佳实践。诸如Pod设计,服务,部署之类的东西。例如,我可以创建一个其中包含单个Web和应用程序容器的Pod,但
我是一名优秀的程序员,十分优秀!