- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
正确的软件架构是创建可维护项目的关键。什么是适当的手段是 100% 主观的,但最近我喜欢并尝试关注Clean Architecture作者:Robert C. Martin(又名鲍勃大叔)。
虽然我真的很喜欢这个理论,但它缺乏某种实用的实现指南来应对开发人员可能面临的常见技术挑战。例如,我一直在努力解决的一件事是正确实现演示层。
演示者负责接受来 self 的用例的“响应”并以某种方式对其进行格式化它可以“呈现”到我的输出设备(无论它是 Web 还是 CLI 应用程序)。
解决这个问题有多种方法,但它们通常属于以下类别之一:
选项 1 或多或少与 Clean Architecture/Uncle Bob 所说的相同(在本书和各种帖子中,见后面),选项 2 是一种可行的替代方法。
听起来很酷,但让我们看看如何在 Go 中实现它们。
这是我的第一个版本。为简单起见,我们的输出现在转到网络上。
另外,请原谅我的简洁。
package my_domain
import "http"
type useCase struct {
presenter presenter
}
func (uc *useCase) doSomething(arg string) {
uc.presenter("success")
}
type presenter interface {
present(respone interface{})
}
type controller struct {
useCase useCase
}
func (c *controller) Action(rw http.ResponseWriter, req *http.Request) {
c.useCase("argument")
}
基本上它完全按照上面和 Clean Architecture 中的描述进行操作:有一个调用用例的 Controller (通过边界,此处不存在)。用例做某事并调用演示者(未实现,但这正是问题所在)。
我们的下一步可能是实现 presenter....但是鉴于输出在 Go HTTP 处理程序中的工作方式,有一个很好的问题需要解决。即:请求范围。
每个请求都有它自己的响应编写器(传递给 http 处理程序),响应应该写入其中。演示者没有可以访问的全局请求范围,它需要响应编写器。因此,如果我想遵循选项 1(调用演示者的用例),我必须以某种方式将它传递给演示者,演示者以这种方式成为请求范围,而应用程序的其余部分是完全无状态的并且不在请求范围内,它们被实例化一次.
这也意味着我要么将响应编写器本身传递给用例和呈现器(我宁愿不这样做),要么为每个请求创建一个新的呈现器。
我在哪里可以这样做:
这带来了另一个问题:如果演示者是请求范围的,用例也是吗?
如果我想将演示者注入(inject)到用例结构中,那么是的,并且还必须在 Controller 中创建用例。
或者,我可以使演示者成为用例的参数(没有人说必须在“构建时”注入(inject)依赖项)。但这仍然会在某种程度上将演示者与 Controller 耦合。
还有其他 Unresolved 问题(例如,我应该将 HTTP header 发送到哪里),但这些问题不太具体。
这是一个理论问题,因为我还不确定我是否想使用这种模式,但我已经花了相当多的时间思考这个问题,但到目前为止还没有找到完美的问题。
基于articles and questions我读过有关该主题的文章:其他人也没有。
最佳答案
我可以根据 Clean Architecture 告诉您我的经验。我花时间在那个问题上,阅读文章和测试代码。所以我想向您推荐以下帖子和所附的源代码,它对我帮助很大:
这是一个非常好的起点,我正在以这种方式设计我的软件,开发 Restful 网络应用程序,直到通过 jQuery 和 Bootstrap 向用户展示。我可以说,现在我的软件真正深入到了独立的层中。它还帮助我理解了 te golang 接口(interface)的强大功能,并最终对软件的每个部分进行了简单的测试。希望这对您也有帮助。
关于go - 如何按照Clean Architecture在Golang中实现presenter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51119690/
let appDelegate = UIKit.UIApplication.shared.delegate! if let tabBarController = appDelegate
我的演示文稿终于成功了。我的第一个屏幕有一个主要的 activity,第二个屏幕有一个 Presentation。我的问题是,我无法更改演示 View 中的内容。 为什么我不能在第二个屏幕上显示演示文
这个问题在这里已经有了答案: ios, getting a pointer to a controller from a view (5 个答案) 关闭 4 年前。 我有一个 uiview 文件,我
我有一个表示小部件的 View 类和一个随附的演示者类。我还有一个 View 类,用于拥有小部件的窗口,以及窗口 View 的随附演示者。窗口操作小部件,所以我需要窗口展示器与小部件展示器进行通信。可
关闭相机后。它给了我这个警告:在演示过程中尝试继续演示! - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picke
由于这个错误,我无法切换到另一个 View Controller 。我想在成功扫描二维码后切换到另一个 View Controller 。 2015-01-27 17:59:16.093 *[5416
有时它会发生 - 从代码的不同地方 - 我们想要做 UIViewController.presentViewController(a, b, c),有时我们已经在呈现了,在这种情况下我们得到: 警告:
这是我的第一个 iOS 应用程序。 所以我有一个 UIVIewController 和一个 UITableView,其中我按顺序集成了一个 UISearchBar 和一个 UISearchContro
我的模式允许一个特定的元素是可选的,但是当我稍后在文件中遇到一个不同的也是可选的元素时,我需要前一个元素存在。我如何通过 XSD 确保这一点? 例子: true 应该是有效的,
我正在使用 xcode 4.5.2 并为相机按钮创建了自己的 OverlayViewController。 现在,当我的委托(delegate) Controller - TakePhotoViewC
如何在 MVP 中创建 View ? Presenter 是否总是创建它们(除了 subview 的 View 之外)?或者它是一个单独的第三方组件或应用程序或创建它们的东西? 我们还要补充一点,我可
当我调用viewController.presentViewController时,如果已经存在另一个 Controller ,则会出现以下警告。 Warning: Attempt to presen
我有一个关于 React Native 的模块,并在这个问题的标题中抛出错误。这是模块的代码,我不知道 swift 或 Objective-C,所以我需要你像“swift for idiots”一样解
我在 didSelectRowAtIndexPath 中选择一个 segue 时收到上面的警告。这发生在 iPad 上。 iPhone 给出了不同的警告,我会看看是否可以解决这个问题。 我在方法中确实
我的应用程序中有一个包含两个场景的 StoryBoard - 它使用自动转场(在 IB 中创建)。当在第一个 UIViewController 中单击按钮时,第二个 UIViewController
如何在成功验证登录后转到我的第二页? 我已经从登录页面 View Controller (不是登录按钮)拉出一个 segue 到下一页,并将该 segue 命名为“nextPage”。 (如果我从登录
我正在构建一个应用程序,最近发现了由传统转场引起的巨大内存泄漏。因此我了解了 unwind segue。如果我简单地使用,一切都很好: @IBAction func prepareForUnw
我不知道如何将按钮添加到 link_to_add_fields 中 在我制作的 Rails 应用程序中。 我尝试在各处添加 class: "btn btn-mini btn-info",但我一直收到
大家好,感谢阅读。我正在制作一个应用程序,您可以在其中拍照并从相机胶卷中检索照片并将其显示在 View 中。问题是,当我尝试使用调出相机胶卷的按钮时,出现如上标题中的错误“演示正在进行中”。 如果我注
我有一个模型,其中有两个字段在技术上可以为空。字段名称是 :is_activated 和 :activated_at。 :activated_at 仅在 :is_activated 设置为 true
我是一名优秀的程序员,十分优秀!