什么是共同的方式为面向对象的图案设计(数据的访问)
-
02-07-2019 - |
题
最初有DAL对象,我的博就是所谓的信息,然后传递给用户界面。然后我开始注意到减少代码中的用户界面和有控制的课程。什么是体面的记.
我目前的结构矿
Public Class OrderDAL
Private _id Integer
Private _order as Order
Public Function GetOrder(id as Integer) as Order
...return Order
End Function
End Class
然后我已经控制器控制的课程(最近实施的这种风格的)
Public Class OrderController
Private Shared _orderDAL as new OrderDAL
Public Shared Function GetOrder(id) As Order
Return _orderDAL.GetOrder(id)
End Function
End Class
然后在我的申请
My app Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
msgbox(OrderController.GetOrder(12345).Customer.Name)
End Sub
End app
我最初找到与共享类我没有必要保持创建一个新的实例,达尔每当我需要获取数据
Dim _orderDAL as New OrderDal
_orderDAL.GetOrder(1234)
.....
你怎么看?
感谢
解决方案
我过去曾使用过您的解决方案,而我遇到的唯一问题是“共享”问题。或“静态的”或“静态的”方法不支持继承。当您的应用程序增长时,您可能需要支持不同类型的“OrderControllers”。
从理论上讲,支持不同OrderControllers的既定方法是创建一个工厂:
OrderControllerFactory.ConfiguredOrderController().GetOrder(42);
这里的问题是:“ConfiguredOrderController()”返回什么类型?因为它必须具有静态的“GetOrder(int id)”。方法 - 继承或接口不支持静态方法。解决这个问题的方法不是在OrderController类中使用静态方法。
public interface IOrderController
{
Order GetOrder(int Id)
}
public class OrderController: IOrderController
{
public Order GetOrder(int Id)
{}
}
和
public class OrderControllerFactory()
{
public IOrderController ConfiguredOrderController()
{}
}
因此,通过对控制器使用非静态方法可能会更好。
其他提示
我认为有几个备选方案中列出的这个优秀的书: 模式的企业应用程序结构.一些模式,可能是你感兴趣:
您的应用程序不应该实例化数据访问层的单独版本,因此您可以控制它。你发布的Psuedo代码真的很难读。
问题是,您的数据访问层是什么,有多少?这将决定你所做的一切。如果您坚持使用文件,那么我认为您所写的内容很好,如果您需要与系统中的其他控制器共享,则可以将项目包装成singelton(不寒而栗)。
如果你真的在进行订单处理并坚持回到数据库,我个人认为是时候看一下ORM了。这些包将为您处理CRUM方面,并减少您必须维护的项目数。
我的$ .02,一旦我看到更好的例子,我保留修改我的答案的权利。
我不能说VB细节,因为我不是VB开发人员,但是:
您正在做的是一个完善的良好做法,将GUI /表示层与数据层分开。在GUI事件方法中包含真正的应用程序代码是一种(遗憾的是已经确定的)不良做法。
您的控制器类类似于桥接模式,如果两个层都应该是一个好主意能够在没有其他人知道的情况下改变他们的形式。
继续!
这是一个很好的做法 - 特别是当你到达控制器需要做的事情而不是简单地委托给底层DAL时。