일련의 작업을위한 최고의 OOP 디자인 패턴


11

응용 프로그램을 개발 중이며 모듈은 다음과 같은 재무 작업을 순차적으로 수행합니다.

사용자가 특정 금액을 은행 계좌로 이체하도록 요청하는 경우 :

  1. 지금 거래가 가능한지 확인 하시겠습니까? (거래는 특정 기간에만 수행 할 수 있습니다)
  2. 사용자가 인출 할 최소 금액을 요청했는지 확인
  3. 사용자에게 기본 계정이 있는지 확인

위의 모든 작업 결과를 기록해야합니다.

위의 모든 조건이 만족되면 거래가 수행됩니다. 앞으로 몇 가지 추가 검사가있을 수 있습니다.

위의 경우에 가장 적합한 객체 지향 디자인 패턴은 무엇입니까?


3
문제를 해결하기 위해 디자인 패턴을 찾지 마십시오. 디자인 패턴을 사용하여 올바른 솔루션을 전달하십시오. programmers.stackexchange.com/questions/70877/… SOLID 원칙을 따르십시오.
pdr

2
동의하지 않습니다. 패턴은 의사 ​​소통을 용이하게하는 이름을 가지고 있으며 솔루션을 전달하는 데에도 사용해야합니다. 그러나 나는 "문제를 해결하기 위해 디자인 패턴을 찾지 마십시오"라는 것에 동의하지 않습니다. 특정 문제를 해결할뿐만 아니라 다른 힘과 제약도 처리합니다. "프록시"및 "데코레이터"를 살펴보십시오. 그들은 비슷해 보이지만 다른 문제를 해결합니다. 제 생각에는 문제를 직접 해결하기 전에 최소한 문제를 해결하기위한 표준 방법과 문제를 쉽게 전달할 수있는 잘 알려진 디자인 패턴을 살펴 봐야합니다.
Jonny Dee

10
패턴이 무엇인지에 대한 좋은 특성화는 다음과 같습니다. "[패턴]은 조직에서 프로그래밍 컨텍스트에 이르기까지 소프트웨어 개발 중 특정 상황에서 반복적으로 발생하는 문제에 대해 효과적이고 구체적이며 적응 가능한 솔루션을 제공합니다." [POSA5, p. 30] 따라서 이러한 관점에서 적응 형 솔루션으로 패턴을 찾는 것이 합법적 인 접근 방법이라는 것이 완전히 분명합니다.
Jonny Dee

3
평범한 오래된 절차 적 프로그래밍을 설명하기 위해 객체 지향 구조를 요구하고 있습니까?
mouviciel

4
KISS 원칙을 따르십시오. 지금까지 단일 방법으로 3 개의 "if"문으로 문제를 해결할 수 있습니다. 시원하기 위해 디자인 패턴을 사용하지 마십시오. 추가 수업을 작성할 때마다 항상 다음과 같이 생각하십시오. 정말로 필요합니까?
Eiver

답변:


13

당신이 찾고있는 것이 책임사슬 인 것 같습니다 . 이 경우 다음 클래스를 가질 수 있습니다.

  • TransactionValidatorBase 추상 기본 클래스
  • TransactionTimeValidator
  • TransactionAmountValidator
  • TransactionAccountValidator

그러나 여러 규칙을 지정하기 위해 서로 연결되어 있습니다.

퍼터 리딩


11
나는 책임의 사슬 (Chain of Responsibility)이 더 필터라는 것을 이해하고있다. 즉 책임에 대처할 수있는 사람을 찾을 때까지 우리는 사슬을 내려 간다. 실제적인 관점에서 COR의 한 가지 단점은 값을 반환하기가 어렵다는 것입니다.
Amy Blankenship 2

나는 당신이 R의 1 레벨 체인을 가질 수 있다고 생각합니다. 실제로 약간의 감탄으로 체인에서 값을 반환하는 것이 어렵다고 생각하지 않습니다. 각 레벨은 특정 기본 인터페이스를 준수하여 통신해야하며, 이러한 입력이 기본 인터페이스를 준수하는 경우 아래에서 입력을 수락해야합니다. 보다 친밀하게 결합 된 두 개의 체인 레벨 사이에 인터페이스 풍부 성 이 필요한 경우,이를 지원하기 위해 감쇄를 다형화 할 수 있습니다.
Andyz Smith

3

입력 단계를 변경하지 않고 일련의 단계가 검증 작업을 수행하는 경우 (있는 것처럼) 대부분의 경우 @pswg의 답변에 설명 된 것처럼 "책임의 체인"패턴을 생각합니다.

그러나 귀하의 질문이 좀 더 일반적이기 때문에 "파이프 라인 처리"도 추가하고 싶습니다.이 단계에서는 다음 단계의 입력이되는 출력을 생성하므로 (원래 입력을 변경) .

다음은 두 가지 기사입니다.
Martin Fowler의 파이프 라인 콜렉션
패턴에 대한 추가 이론적 논의


2

여기서 올바른 패턴은 상황에 따라 다릅니다. 고집 할 특정 패턴을 선택하기 전에 그 질문에 대한 답을 찾으려고 노력할 것입니다.

  • 런타임에 (1,2,3) 검사의 다른 조합을 작성해야합니까?
  • 동작을 수행하기 위해 동일한 변수가 필요합니까 아니면 크게 다른가요?
  • 오류 메시지는 얼마나 정확해야합니까?
  • 실패한 경우 사용자는 항상 (1) 단계부터 다시 시도합니까?
  • 동시성은 어떻게 처리됩니까?
  • 각 메소드는 요청에 무언가를 추가하거나 단순히 유효성을 검사합니까? (예 : 기본 계정 ID?)

직감에 따라 오류 코드에 대한 매개 변수를 집계하여 일반 방법으로 코딩합니다.

public void DoTransaction(IErrorAgregator error, TransactionRequest request)
{
    if(!IsTransactionInCertainTimePeriod(request, error)) return;
    if(!IsTransactionAmountInUserBounds(request, error)) return;
    if(!UserHaveDefaultAccount(request, error)) return;
    bankingTransactor.PerformTransaction(request);
}

DoTransaction을 "ITransactionValidationStragegy"인터페이스에 넣고 유효성 검증 상용구 코드를 포함하는 계층 수퍼 유형을 작성하는 것이 좋습니다.

그러나이 디자인에서는 유효성 검사 논리가 컴파일 타임에 결정된다고 가정합니다.


0

패턴이 이미 여기에 언급되어 있지만 사용중인 프레임 워크를 기반으로 응용 프로그램에서 동일한 패턴을 사용하는 방법에 대해 생각하는 것이 좋습니다.

예를 들어, 수행하려는 유효성 검사는 시간이 지남에 따라 변경 될 가능성이 높습니다 (트랜잭션을 하루에 10 개로 제한하는 새 유효성 검사를 추가하고 싶을 수도 있음). 또한 실제 비즈니스 서비스 나 통합 코드가 시작되기 전에 유효성 검사를 수행하지 않을 수도 있습니다. 유효성 검사를 구성 가능한 것으로 추가 할 수 있으면 좋을 것입니다.

Struts를 사용하는 경우 인터셉터를 사용하는 것이 좋습니다. 스프링의 경우 의존성으로 Bean을 주입하면 유연성이 향상됩니다. 내 제안은 패턴 / 이디엄뿐만 아니라 응용 프로그램을 작성하고 미래의 관점에서 요구 사항에 가장 잘 맞는 프레임 워크를 보는 것입니다.


-2

내 이해에 따르면 필요한 것은 무엇이든 아래와 같은 명령 패턴에 맞출 수 있습니다. 클래스 디자인은 다음과 같이 수행 할 수 있습니다.

interface Transaction{
void performAction();
}

class Banking{

void moneyValidation(){
//Validate Here
}

void timeValidation(){
//validate Here
}
}

class TimeValidation implements Transaction{

public Banking bank;

public TimeValidation (Banking bnk){
bank=bnk;
}

void performAction(){
bnk.timeValidation();
}


class MoneyValidation Implements Transaction{

public Banking bank;

public MoneyValidation(Banking bnk;){
bank=bnk;
}

void performAction(){
bnk.moneyValidation();
}
}


class Control{

private List val_list=new ArrayList();

void storeValidation(Transaction trans){
val_list.add(trans);
trans.performAction(val_list.getFirstAndRemove());
}
}

//Same for other validation classes

클라이언트 클래스에는 다음 코드 스 니펫이 포함됩니다.

Banking bnk = new Banking();
MoneyValidation m_val = new MoneyValidation (bnk);
TimeValidation t_val = new TimeValidation (bnk);
Control ctrl = new Control();
ctrl.storeValidation(m_val);
ctrl.storeValidation(t_val);

이것은 위의 시나리오와 함께 내 이해에 따라 다릅니다.


돈 유효성 검사가 실패하면 시간 유효성 검사가 쓸모가 없지만 어쨌든 수행되기 때문에 나쁩니다.
Ewoks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.