2010-11-21 6 views
6

저는 대학생 (컴퓨터 과학)이며 방금 C# 프로그래밍 수업을 시작했습니다. 과제를 위해 나는 프로젝트에서 여러 번 사용할 수있는 콘솔 출력을 넣는 "Display"클래스를 사용 해왔다. 예를 들어, 프로그램을 계속하거나 종료하라는 요청입니다. Main()에 여러 번 입력하는 대신이 메서드를 Display 클래스에서 호출합니다.올바른 클래스 사용?

상위 수준의 다른 학생이 나에게 이렇게해서는 안된다고 말했습니다. 그것은 코딩 방법이 좋지 않으며 기본 클래스 (Main() 포함)에 모든 메서드를 포함하고 절대적으로 필요한 경우에만 다른 클래스를 사용해야합니다.

일부 입력과 조언을 찾고 있습니다.

코드를 포함하도록 요청 받았습니다. 원래는 갈 예정 이었지만이 게시물을 너무 오랫동안 만들고 싶지 않았습니다. 상당히 짧은 한 과제를 선택했습니다. 나는 단지 당신이 많은 사람들이 글을 쓸 수있는 것처럼 코드가 우아하지 않도록 배우는 중임을 분명히 밝힙니다. 건설적인 비판은 대단히 환영합니다.

궁극적으로 저는 수업을 사용하고 있습니다. Display 클래스의 메서드 중 일부는 Main()에서도 쉽게 사용할 수 있습니다.

는이 요청 클래스 그 것이다

namespace Chapter_6_10 
{ 
// This class is used to get user input 
class Request 
{ 
    public static void UserInput(out char PrintingCharacter, out int PeakNumber) 
    { 
     string input = " "; 
     char testCharacter = ' '; 
     int testNumber = 0; 

     // a do... while loop to get Printing Character from user 
     // use TryParse() to test for correct input format 
     do 
     { 
      Console.Write("\nPlease enter a character to be used to build triangle : "); 
      input = Console.ReadLine(); 
      bool result = char.TryParse(input, out testCharacter); 
      if (result) 
      { 

      } 
      else 
      { 
       Console.Clear(); 
       Display.Error(input); 
       input = " "; 
      } 
     } 
     while (input == " "); 
     // a do... while loop to get number from user 
     // use TryParse() to test for correct input format 
     do 
     { 
      Console.Write("\nPlease enter a number <between 1 and 10> for the peak of the triangle : "); 
      input = Console.ReadLine(); 
      bool result = int.TryParse(input, out testNumber); 
      if (result) 
      { 
       if ((testNumber > 0) && (testNumber < 11)) 
       {       
       } 
       else 
       { 
        Console.Clear(); 
        Display.Error(testNumber.ToString()); 
        input = " "; 
       } 
      } 
      else 
      { 
       Console.Clear(); 
       Display.Error(input); 
       input = " "; 
      } 
     } 
     while (input == " "); 
     // assigned received values to 'outs' of method 
     PrintingCharacter = testCharacter; 
     PeakNumber = testNumber; 
    } 
} 

입니다 홈페이지가 들어있는 프로그램 클래스()

namespace Chapter_6_10 
{ 
class Program 
{ 
    static void Main() 
    { 
     string triangle = "", result = " ";; 
     char printingCharacter = ' '; 
     int peakNumber = 0; 
     Display.Instructions(); 
     Display.Continue(); 
     // perform a do... while loop to build triangle up to peak 
     do 
     { 
      Console.Clear(); 
      Request.UserInput(out printingCharacter, out peakNumber); 
      int counter = 1, rowCounter = 0; 
      do 
      { 
       do 
       { 
        triangle += printingCharacter; 
        rowCounter++; 
       } 
       while (rowCounter < counter); 
       counter++; 
       rowCounter = 0; 
       triangle += "\n"; 
      } 
      while(counter != peakNumber); 
      // perform a do... while loop to build triangle from peak to base 
      do 
      { 
       do 
       { 
        triangle += printingCharacter; 
        rowCounter++; 
       } 
       while (rowCounter < counter); 
       counter--; 
       rowCounter = 0; 
       triangle += "\n"; 
      } 
      while (counter != 0); 
      Console.Clear(); 
      Console.WriteLine(triangle); // display triangle 
      Display.DoAgain(out result); // see if user wants to do another or quit 
      triangle = "";     
     } 
     while (result != "q"); 
    } 
} 

이 Display 클래스

namespace Chapter_6_10 
{ 
// This class displays various outputs required by program 
class Display 
{ 
    // This method display the instructions for the user 
    public static void Instructions() 
    { 
     Console.WriteLine("\nThis program will ask you to enter a character to be used " 
      + " to create triangle." 
      + "\nThen you will be asked to enter a number that will represent the" 
      + "\ntriangles peak." 
      + "\nAfter your values have been received a triangle will be drawn."); 
    } 
    // This method displays the choice to continue 
    public static void Continue() 
    { 
     Console.WriteLine("\n\nPress the enter key when you are ready to continue..."); 
     Console.ReadLine(); 
    } 
    // This method displays an error message 
    public static void Error(string ErrorType) 
    { 
     Console.WriteLine("\nYou have entered \"{0}\", which is a value that is not valid!" 
      + "\nThis is not rocket science." 
      + "\n\nTry agian...", ErrorType); 
    } 
    // This method will ask user to press enter to do again or 'q' to quit 
    public static void DoAgain(out string Result) 
    { 
     string input = " "; 
     Console.WriteLine("\nPress enter to run program again" 
      + "\nor type the letter 'q' to close the application."); 
     input = Console.ReadLine(); 
     // convert input to lowercase so that only one test needed 
     Result = input.ToLower(); 
    }   
} 

에게입니다. 이것이 코드 작성에있어서 비 효과적인 방법으로 간주 될 것인가? 어떻게 개선 할 수 있습니까?

지금까지 모든 입력에 감사드립니다. 그것은 나에게 매우 가치있다.

+2

코드를 공유 할 수 있습니까? 실제로 코드를 보게 될 때 코드에 대해 언급하는 것이 더 쉽습니다. –

+3

아래에서 다루어지기 때문에 이것을 대답으로 넣지는 않겠지 만이 다른 학생이 그 이유 중 하나라고 말하고 싶습니다. 너무 많은 나쁜 코드가 있습니다. 그에게이 링크를 보내고 솔직하게. :) –

+0

나는 Fredrick Mörk에 따라 나의 과제 중 하나에서 코드를 추가했다. 모든 입력을 부탁드립니다. – subcan

답변

14

철저하고 잘 디자인 된 클래스 구조는 object-oriented design 원칙을 준수하는 데 매우 중요합니다. 그것은 분업을 생성하고 차등 작업을 편석되어

  • : 여기

    별도의 클래스로까지 관련 코드를 깨는 고려해야 할 몇 가지 이유가 있습니다. 이것은 때로 모든 개체 (클래스)가 단일 책임을지며 단일 작업 완료에 집중해야한다고 말하는 Single Responsibility Principle으로 설명됩니다. Encapsulation도 여기에서 중요한 원리가됩니다. 기본적으로 데이터가 해당 데이터에서 작동하는 메소드와 함께 번들로 제공됩니다. 이렇게하면 버그가 코드에 들어가는 기회를 줄일 수 있습니다.

  • code reuse을 홍보하는 데 도움이 될 수 있습니다. 이미 작성한 코드로 기존 클래스를 가져 와서 응용 프로그램 전체에 코드가 흩어져있는 경우보다 다른 응용 프로그램에 통합하는 것이 훨씬 쉽습니다. 왜 같은 코드를 반복해서 재 작성해야합니까?

  • 잘 디자인 된 클래스 구조는 코드를 더 쉽게 이해하고 개념화 할 수있게 해주는 논리적 계층 구조를 만들 수 있으며 응용 프로그램을 장기적으로 쉽게 유지 관리 할 수 ​​있습니다. 우리 컴퓨터에서 파일을 폴더로 구성하는 것과 같은 이유입니다. 그리고 우리의 삶에있는 다른 모든 것들 (또는 최소한 우리는 시도합니다)입니다.

+0

답변 해 주셔서 감사합니다. 나는 객체 지향 디자인 위키 페이지를 보았다. 저자는 "수업은 무언가의 성격을 나타내는 청사진이나 공장이라고 할 수 있습니다."라고 말합니다. 원래 게시물에 코드를 추가했습니다. Display 클래스가이 원칙을 따르지 않는다고 말씀 하시겠습니까? 나는 Main()에서 너무 많은 혼란을 피하려고 노력하고있다. 나는 프로그램에서 프로그램으로 내 코드를 아주 쉽게 따라 할 수 있지만, 다른 사람이 그 코드를 따르는 데 어려움을 겪을 까? – subcan

6

"이것은 좋은 방법입니다"또는 그들이 당신에게 설명 할 수없는 경우 "이것은 나쁜 방법이다"라고 누군가 듣고 절대로 어느이유가 좋은지 나쁜지. 다른 모든 분야와 마찬가지로 프로그래밍에서 많은 고정 관념이 있지만이를 피하십시오.

다소 모호합니다. 클래스가하는 일을 실제로 알지 못하기 때문에 별도의 클래스에서 IO 기능을 분리한다고 생각하지 않습니다. 하지만 그건 정말 또한 그것은 좋은 코딩 방식은 아닙니다 그건 개인적인 취향 :

+1

내 코드를 비난 한 사람은 클래스를 사용하면 프로그램이 클래스를 저장하는 데 더 많은 메모리 위치를 사용해야한다는 것을 의미하고 클래스를 더 크게 축소 할 것이라고 말했습니다. 나는 그에게 내가 수업을 사용하고 있다고 말했다. 그는 코드를 재사용함으로써 코드 작성법을 배우지 않을 것이라고 말했습니다. 이것에 나는 더 많은 '속임수'를 배우면서이 수업들을 끊임없이 바꾸고 있다고 말했다. 그는 여전히 내가 수업을 잘못 사용하고 있다고 주장했다. 나는 모른다. 나는 MSDN에서 수업에 대해 읽고 있었고 아직 미정이다. – subcan

+0

@subcan 요즘에는 일반적으로 객체가 하나 또는 두 개의 추가 바이트를 차지할 것인지 걱정할 필요가 없습니다. 즉, 코드가 이해하기 쉽고, 유지 보수가 쉽고, 확장이 쉽다는 것을 의미합니다. 알고리즘과 데이터 구조를 디자인 할 때 프로그램의 객체 모델을 디자인 할 때 * 아닙니다 *. 우리는 여기서 어셈블리 언어를 말하는 것이 아니라 합리적으로 높은 수준의 OOP 언어 (C#)를 사용합니다. 너무 undiplomatic 죄송합니다,하지만 코드를 비판 그 사람은 확실히 OOP를 수행하기위한 좋은 교사처럼 들리지 않습니다. – stakx

+0

나는 이것이 오래된 게시물 인 것을 안다. 그러나 아멘은 "만약 당신이 왜 당신에게 설명 할 수 없다면 ** 좋은지 나쁜지"라는 말을 들었다. * 모든 좋은 습관은 명백하고 보통 쉽게 설명 할 수있는 이유가 있기 때문이다. – Crisfole

8

에 의존하고 있음이 등 등, 독립적인지 여부, 그것은 무엇에 따라 달라집니다 내의 모든 방법을 포함 불과합니다 I 기본 클래스 [...] 절대적으로 필요한 경우에만 다른 클래스를 사용하십시오.

나는 절대적으로 동의하지 않습니다.이 사고 방식은 결과적으로 결국 의 모든 것을으로 끝내는 약간의 날라가는 주방 싱크 강의로 이어질 것입니다.우리는 당신이 단지 서브 루틴하지만 클래스 — 서브 루틴으로 그것을 분할하는 것입니다 기능을 조직의 주요 수단이있을 수 있습니다에 대한 구조화 프로그래밍을 이야기한다면

귀하의 동료가 잘 될 것입니다. 그러나 여기서 우리는 객체 지향 프로그래밍을 말하고 있습니다. 이것은 또한 기능을 다른 클래스로 나눌 수있는 방법을 제공합니다. 결국 클래스가 사용되어야합니다. 그렇지 않으면 우리는이 OOP을 호출하지 않을 것입니다!

내가 너라면, 필요할 때마다 새로운 수업을 정의하는 다소 자유로운 접근 방식을 선호한다.


P.S : 그것은 당신이 뭔가 새로운 클래스를 필요가 있는지, 당신이 그것을 설계하는 방법을 결정하는 데 도움이 모범 사례가 실제로 있다는 것을 말할 것도 없다. (코디 그레이 (Cody Gray)의 대답을 참고하십시오.) 나는 단순히 OOP에서 의미가 없기 때문에 클래스로 피하고 싶다.

0

일반적으로 같은 것을 여러 번 입력하면 문제가 발생하는 것보다 나쁘다고 생각합니다. 디스플레이 루틴을 캡슐화하는 것은 실제로 좋은 형태입니다. 특히 오류 메시지와 같은 경우 여러 출력에서 ​​출력을 쉽게 변경할 수 있습니다.

그는 C 스타일의 배경에서 더 많이 나올 수도 있지만 C#은 무엇보다 자바와 비슷합니다. 교실의 자유 사용이 허용되며 심지어 권장됩니다.

+3

심지어 C 프로그래머는 모든 것을 한 곳으로 던져 버리지 않는다는 것을 알고 있습니다. –