2014-10-12 8 views
4

OOP 측면에서 올바른 방식으로 프로젝트에 접근하고 있는지 궁금합니다. 내 프로젝트는 C#의 Windows 콘솔 응용 프로그램으로 구성됩니다. 응용 프로그램의 요점은 사용자 입력을 받아 SQL 쿼리로 변환하고 연결 데이터베이스를 쿼리 한 다음 사용자가 요청한 판독기 친화적 인 형식으로 정보를 추출하는 것입니다. 지금은 다음의 3 종류가 있습니다OOP의 전통적 의미와 관련이없는 클래스의 상속

클래스 : commandLineInterpreter는 사용자가 이용할 수있는 sqlQueries

명령 출력이 클래스의 지문을 확장합니다. 또한 사용자 입력이 필요합니다.

클래스 : sqlQueries는 dbConnect

이 클래스는 사용자가 inputing 내용에 따라 데이터베이스를 조회 할 SQL 쿼리를 보유를 확장합니다.

클래스 : dbConnect 이 클래스는 데이터베이스 연결을 초기화하고 성공했는지 여부를 나타내는 메시지를 인쇄합니다.

나는 db connect 클래스를 확장 한 SQL 쿼리 클래스를 확장하는 commandlineInterpreter 클래스가 있습니다.

main() 함수에서 명령 행 클래스를 초기화 할 때 자동으로 다른 확장 클래스도 intitlizes. DB에 연결하지 않고 커맨드 라인 인터프리터가 아무 대답도하지 못하기 때문에 나는 이것을했다.

내 질문에, 비록 이러한 클래스가 OOP의 상속 의미와 관련이 없어도 클래스 상속을 이런 방식으로 수행하는 것이 좋습니다. 또는 내 코드를 구성하는 더 좋은 방법이 있습니까?

답변

1

상속은 일반적으로 "A is B"의 관계를 나타냅니다. 예 : 사과는 과일입니다. 그러나 여기에는 완전히 관련없는 수업이 있습니다. 그것들을 명료하게 유지하고 별개의 작업들을위한 별도의 객체들을 생성하십시오.

dbConnect 클래스는 DB에 연결하고 메시지를 표시하는 두 가지 매우 다른 측면을 혼합합니다. commandLineInterpreter 클래스는 사용자와 상호 작용하고 메시지를 표시하는 유일한 클래스 여야합니다. dbConnect 클래스는 불필요한 것처럼 보입니다. 연결 기능은 sqlQueries 클래스로 이동해야합니다. 명령 행 인터프리터에서 호출 할 수있는 방법 bool Connect()을 작성하십시오. 부울 결과는 적절한 메시지를 표시하는 데 사용될 수 있습니다.

class SqlQueries 
{ 
    private SqlConnection connection; 

    public bool Connect() 
    { 
     Try { 
      connection = ... 
      connection.Open(); 
      return true; 
     } catch { 
      return false; 
     } 
    } 

    .... 
} 

class CommandLineInterpreter 
{ 
    public void Run() 
    { 
     var sqlQueries = new SqlQueries(); 
     if (sqlQueries.Connect()) { 
      Console.WriteLine("connected"); 

      // run your interpreter here 
      ... 
     } else { 
      Console.WriteLine("Connection error! Not connected."); 
     } 
    } 
} 

C# 유형 (클래스와 같은)에서는 속성, 메서드 및 이벤트에 PascalCase가 있습니다. 필드, 메소드 매개 변수 및 로컬 변수에는 camelCase가 있습니다.

7

개체에 관계형 계층이 없으므로이 디자인에 약간 동의하지 않습니다.

명령 줄 해석기는 SQL Queries 클래스에 관해서는 알지 못합니다. 그것은 일종의 관심사이며 사용자 입력을 읽는 것 뿐이며 수집 된 입력을 다음 서비스 계층, 즉 SQL 쿼리 클래스에 전달할 수 있습니다.

2

상속은 C와 같은 다른 언어와 비교하여 OOP- 언어에서 사용할 수있는 매우 강력한 도구입니다. 그러나 상속을 적용 할 때 기본적으로 이므로 디자인을 실제로 호출 할 때만 사용해야합니다. 그것을 위해. 즉, 'B는 - A'종류의 관계가 확실 할 때이 존재합니다. 도망 갈 수있는 경우 항상 구성상속 이상으로 지정하십시오. 이는 디자인에 훨씬 더 많은 유연성을 제공하기 때문입니다.

예를 들어 DbConnect에 몇 가지 추가 기능을 추가하려면 어떻게해야합니까? 이제이 변경이 디자인의 하위 클래스에 의해 만들어진 가정을 깨지 않는지 고려해야합니다. 컴포지션을 사용하면 클래스가 훨씬 더 격리되어 설계됩니다. 또한, 상속은 암묵적으로 서로 다른 클래스의 수명과 상태를 연결합니다. 즉 상속이 실제로 작동하도록 정렬되어야합니다.

CommandLineInterpreter 클래스가 데이터베이스에 연결해야한다고해서 그 클래스에서 상속해야한다는 것을 의미하지는 않습니다.단지 구성을 사용하고 필요할 때마다 통역사 내부에서 연결을 만드십시오.

1

commandLineInterpreter, sqlQueries, dbConnect 클래스간에 상속 할 필요가 없습니다. 일부 클래스 (자체 기능 포함)에도 다른 클래스의 기능이 포함되어있을 때 상속이 필요하기 때문입니다.

그러나 여기에는 하나의 클래스가 연관되어있을 때 (어떤 클래스가 어떤 작업을하고 다음 클래스가 남아있을 때) 다른 클래스에 대한 연관성 (OOP 개념)이 sqlQueries와 dbConnect 클래스간에 사용될 수 있습니다.

연관 관계의 경우, sqlQueries의 dbConnect 오브젝트를 사용하십시오.

+0

관계 유형의 연관성은 어떻습니까? – john

+0

다릅니다. 클래스 A가 실제로 B 유형의 인스턴스를 소유하고 수명을 관리하는 경우 A는 일반적으로 B의 인스턴스를 생성자에 작성하고이를 private 읽기 전용 속성에 지정합니다. 그러나 클래스 간의 '디자인 타임 관계'가 어떻게 프로그래밍되어야하는지에 대한 구체적인 규칙은 없습니다. 이것은 모두 인스턴스 수명, 인스턴스의 성능/처리, 인스턴스의 소유권, 다른 시점의 정보 가용성 등과 같은 요구 사항에 매우 의존합니다. –