OOP 패턴 디자인의 일반적인 방법 (데이터 액세스)
-
02-07-2019 - |
문제
원래 내 BO가 정보를 요청한 다음 UI로 전달한 DAL 객체가있었습니다. 그런 다음 UI에서 감소 된 코드를 알아 차리기 시작했고 컨트롤러 클래스가있었습니다. 괜찮은 추천은 무엇입니까?
나는 현재 내 것을 구조화하고있다
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()
{}
}
따라서 컨트롤러에 비 정적 메소드를 사용하여 더 나을 것입니다.
다른 팁
이 훌륭한 책에는 몇 가지 대안이 나열되어 있다고 생각합니다. 엔터프라이즈 애플리케이션 아키텍처 패턴. 당신에게 관심이있는 몇 가지 패턴 :
응용 프로그램이 데이터 ACCES 계층의 분리 된 버전을 인스턴스화해서는 안됩니다. 게시 한 PSUEDO 코드는 읽기가 어렵습니다.
문제는 데이터 액세스 계층이 무엇이며 얼마가 있습니까? 그것은 당신이하는 일의 좋은 부분을 지시 할 것입니다. 파일에 대한 셔츠를받는다면, 나는 당신이 작성한 내용이 괜찮다고 생각하며, 시스템의 다른 컨트롤러와 공유해야한다면 항목을 Singelton (Shudder)으로 포장 할 수 있습니다.
주문 처리를 실제로하고 데이터베이스로 돌아 가면 ORM을 볼 시간이라고 생각합니다. 이 패키지는 귀하의 CRUM 측면을 처리하고 유지해야 할 품목의 수를 줄입니다.
내 $ .02와 나는 더 나은 예를 보면 대답을 수정할 권리가 있습니다.
VB 개발자가 아니기 때문에 VB 세부 사항에 대해서는 말할 수 없습니다.
당신이하는 일은 GUI/프리젠 테이션 계층을 데이터 계층에서 분리하는 잘 확립 된 모범 사례입니다. GUI 이벤트 방법에 실제 응용 프로그램 코드를 포함시키는 것은 (슬프게도 잘 확립 된) 나쁜 연습입니다.
귀하의 컨트롤러 클래스는 브리지 패턴 두 층이 다른 계층이 다른 사람이 알지 못하고 형태를 변경할 수 있어야하는 경우에도 좋은 생각입니다.
가라!
우수한 관행입니다. 특히 컨트롤러가 기본 DAL에 대한 간단한 대표단 이상을 수행 해야하는 지점에 도달 할 때.