문제

나는 DAO를 사용하는 자칭 VB6 프로그래머입니다. 아래는 내가 휘젓을 수있는 일반적인 코드의 예입니다.

Sub cmdMultiplier_Click()  'Button on form, user interface ' 
  dim Rec1 as recordset
  dim strSQL as string

  strSQL = "select * from tblCustomers where ID = " & CurrentCustomerID  'inline SQL '
  set rec1 = GlobalDataBase.openrecordset(strSQL)    ' Data access '

  if rec1.bof <> true or rec1.eof <> true then
    if rec1.fields("Category").value = 1 then
      PriceMultiplier = 0.9         ' Business Logic ' 
    else
      priceMultiplier = 1
    end if
 end if
End Sub

위의 것은 CRUD 응용 프로그램의 전체 소스 코드 인 척하십시오. 나는이 디자인이 나쁘다는 것을 알고 있습니다. 모든 것이 함께 섞여 있습니다. 이상적으로는 3 개의 별개의 계층, 사용자 인터페이스, 비즈니스 로직 및 데이터 액세스가 있어야합니다. 나는 이것이 바람직한 이유를 알지만 그것이 어떻게 끝났는지 모르겠다. 그리고 그것이 왜 그런 분리가 좋은지 완전히 알지 못한다고 생각한다. 누군가가 위의 우스꽝스럽게 사소한 예를 3 계층으로 재조정 할 수 있다면 나는 길을 훨씬 더 내려갈 것이라고 생각합니다.

도움이 되었습니까?

해결책

사소한 예, 그렇습니다. 그러나 모든 기본 요소는 3 가지 다른 클래스에 속합니다 (아래 참조). 이것의 주된 이유는 "우려의 분리"원칙입니다. 즉, GUI는 GUI 와만 관련이 있고, BIZ 로직 계층은 비즈니스 규칙에만 관심이 있으며, 데이터 액세스 계층은 데이터 표현과 관련이 있습니다. 이를 통해 각 층을 독립적으로 유지하고 응용 프로그램에서 재사용 할 수 있습니다.

'in Form class - button handler
Sub cmdMultiplier_Click()
    PriceMultiplier = ComputePriceMultiplier(CurrentCustomerId)
End Sub

'in Biz Logic class
Function ComputePriceMultiplier(custId as Integer) as Double
    Dim cust as Customer = GetCustomer(custId)
    if cust.Category = 1 then   'please ignore magic number, real code uses enums
        return 0.9
    end if
    return 1
End Function

'in Data Access Layer class
Function GetCustomer(custId as Integer) as Customer
    Dim cust as Customer = New Customer    'all fields/properties to default values
    Dim strSQL as String = "select * from tblCustomers where ID = " & custId
    set rec1 = GlobalDataBase.openrecordset(strSQL)    ' Data access '
    if rec1.bof <> true or rec1.eof <> true then
        cust.SetPropertiesFromRecord(rec1)
    end if
    return cust
End Function

'실제'응용 프로그램은 현재 고객을 캐시하고, 고객 쿼리 등에 대한 상수 또는 저장 절차를 갖습니다.; 간결함을 무시했다

이것을 버튼 핸들러의 원본과 대조하여 (VB 코드에서는 너무 쉽게 볼 수 있기 때문에 끔찍하게 일반적입니다)-다른 애플리케이션에서 가격 다중 플라이어 규칙이 필요하다면, 당신은 당신이 할 것입니다. 코드를 해당 응용 프로그램의 버튼 핸들러에 복사, 붙여 넣기 및 편집해야합니다. 이제 동일한 비즈니스 규칙을 유지할 두 곳과 동일한 고객 쿼리가 실행 된 두 곳이 있습니다.

다른 팁

버튼의 목적은 무엇입니까?

나의 첫 단계는 다음과 같습니다.

  • 데이터베이스에 액세스하는 부품을 추출하십시오. (경고 : AIR 코드 미리)

기능 getCustomer (오랫동안 CUSTOMERID)

strsql = "select * where id ="& currentCustomerid set rec1 = globaldatabase.openrecordset (strsql) 결과 = 1

rec1.recordCount> 0 인 경우 getCustomer = rec1 else getCustomer = false endif end function

  • 비즈니스 로직 기능을 작성하십시오.

기능 getCustomerDiscount (CustomerId grong)

Customer = GetCustomer (CustomerID)

RES = 1 고객이면 고객이면 고객 ( "범주") = 1) 그런 다음 res = .9 endif endif

GetCustomerDiscount = Res

엔드 기능

  • 그런 다음 버튼을 변경합니다.

sub cmdmultiplier_click () pricemultiplier = getCustomerDiscount (currentCustomerId) END SUB

일반적으로 UI 코드가 사용자가 제기 한 이벤트에 응답 할 수 있습니다.이 경우 버튼을 클릭하십시오.

그 후 실제로 프로그램이 설계되는 방식에 따라 달라지고 가장 기본적인 디자인은 고객 인스턴스를 참조하는 것이며 승수 속성을 포함합니다. 고객 객체는 DAL의 데이터에서 채워집니다.

UI에 대한 검증은 UI 계층으로 이동하고 비즈니스 검증 규칙이 비즈니스 객체로 들어갈 수 있으며 DAL은 지속성 계층입니다.

다음은 매우 기본적인 의사 코드 예입니다.

btnClick
    Dim Cust as New Customer(ID)
    multplr = Cust.DiscountMultiplier
End Click

Class Customer
    Sub New(ID)
        Data = DAL.GetCustomerData(ID)
        Me.Name = Data("Name")
        Me.Address = Data("Address")
        Me.DiscountMultiplier = Data("DiscountMultiplier")
    End Sub
    Property ID
    Property Name
    Property Address
    Property DiscountMultiplier
        Return _discountMultiplier
    End
End Class


Class DAL
    Function GetCustomerData(ID)
        SQL = "Paramaterized SQL"
        Return Data
    End Function
End Class

리팩터를 리팩터하는 방법을 아는 것은 좋은 일입니다. 지금부터 레이어를 분리하는 방법을 알게 될 것입니다.
그러나 나는 당신의 시간이 동시에 사용하는 도구를 업그레이드하는 데 더 나은 시간을 할 것이라고 생각합니다. vb.net으로 그것을 고려하십니까?

이를 수행하는 방법은 기존 코드베이스를 보존하는 것이 VB.Net에서 데이터 계층과 BR을 코딩하는 것입니다. 그런 다음 BR을 통해 COM 인터페이스를 노출 시키십시오 (프로젝트의 확인란 옵션입니다). 그런 다음 현재 인터페이스에서 새 BR을 사용할 수 있습니다.

모든 BR과 DAL이 완료되면 완전한 새로운 플랫폼으로 한 단계 떨어질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top