правильное использование классов? - PullRequest
6 голосов
/ 21 ноября 2010

Я студент колледжа (информатика) и только что начал заниматься программированием на C #.Для наших заданий я использовал класс «Display», куда я помещал любой вывод консоли, который можно было бы использовать несколько раз в проекте.Например, запрос на продолжение или выход из программы.Вместо того, чтобы набирать его несколько раз в Main(), я просто вызываю метод из класса Display.

Другой студент из класса более высокого уровня сказал мне, что я не должен этого делать.То, что это плохая практика кодирования, и что я должен просто включить все методы в основной класс (содержащий Main()) и использовать другой класс только в случае крайней необходимости.

Я просто ищу некоторые входные данные и советы.1008 *

Меня попросили включить код.Я собирался изначально, но не хотел делать этот пост слишком длинным.Я выбрал одно довольно короткое задание.Я хочу уточнить, что я только учусь, поэтому код не так элегантен, как многие из вас могут написать.Конструктивная критика очень приветствуется.

В конечном счете, я просто играю с использованием классов.Я знаю, что некоторые из методов в классе Display также легко могут быть в Main ().

Это класс Program, который содержит Main ()

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();
    }        
}

Это класс запроса

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;
    }
}

Вот и все.Будет ли это считаться неэффективным способом кодирования?Как я могу улучшить это?

Спасибо за все комментарии.Это очень ценно для меня.

Ответы [ 4 ]

15 голосов
/ 21 ноября 2010

Тщательная и хорошо продуманная структура классов чрезвычайно важна для соблюдения принципов объектно-ориентированного проектирования .

Вот лишь несколько причин, по которым следует взломатьсвязанный код разделен на отдельные классы:

  • Создает разделение труда и разделяет дифференциальные задачи.Иногда это объясняется как Принцип единой ответственности , который гласит, что каждый объект (класс) должен нести одну ответственность и сосредоточиться на выполнении одной задачи. Инкапсуляция также быстро становится здесь важным принципом, в основном это означает, что данные связаны с методами, которые отвечают за работу с этими данными.Это также помогает уменьшить вероятность появления ошибок в вашем коде.

  • Это может помочь в продвижении повторного использования кода .Зачастую гораздо проще взять существующий класс с уже написанным кодом и интегрировать его в другое приложение, чем если бы этот код был разбросан по всему приложению.Зачем переписывать один и тот же код снова и снова?

  • Хорошо продуманная структура классов может создать логическую иерархию, которая сделает ваш код более легким для понимания и осмысления, а также облегчит работу вашего приложения.поддерживать в долгосрочной перспективе.По этой же причине мы организовываем файлы на нашем компьютере в папки и все остальное в нашей жизни (или, по крайней мере, мы пытаемся).

8 голосов
/ 21 ноября 2010

Что это плохая практика кодирования и что я должен просто включить все методы в основной класс [...] и использовать другой класс только тогда, когда это абсолютно необходимо.

Я абсолютно не согласен. Такое мышление в конечном итоге приведет к нескольким взорванным классам кухонных раковин, которые в конечном итоге будут делать все .

Ваш коллега был бы прав, если бы мы говорили о структурированном программировании , где у вас могут быть только подпрограммы, но нет классов & mdash; Основным средством организации функциональности будет разделение ее на подпрограммы. Но здесь мы говорим объектно-ориентированное программирование , которое также дает вам возможность разделить функциональность на разные классы. В конце концов, нужно использовать классы, иначе мы бы не назвали этот ООП!

На вашем месте я бы предпочел довольно либеральный подход к определению новых классов, когда они вам нужны.


P.S .:: 1023 * Само собой разумеется, что есть действительно лучшие практики, которые помогут вам решить, нужен ли вам новый класс для чего-то, и как вы должны его проектировать. (См., Например, ответ Коди Грея.) Я просто хочу отметить, что в ООП определенно не имеет смысла активно избегать классов.

6 голосов
/ 21 ноября 2010

Никогда слушайте кого-то, кто говорит "Это хорошая практика" или "Это плохая практика", если они не могут объяснить вам почему это хорошо или плохо.Как и в любой другой области, в программировании есть много стереотипов, старайтесь избегать их.

Для вашего конкретного примера, который немного расплывчатый, потому что я на самом деле не знаю, что делает ваш класс, я не понимаюне думаю, что разделение функций ввода-вывода в отдельный класс - ужасно плохая идея.Однако это действительно зависит от того, что он делает, независимо от того, является ли он независимым и т. Д. И т. Д. Также зависит от личного вкуса:)

0 голосов
/ 21 ноября 2010

В общем, если вы печатаете одну и ту же вещь несколько раз, я думаю, что что-то идет не так.Инкапсуляция таких процедур отображения на самом деле является хорошей формой.Это позволяет вам легко изменять вывод в нескольких экземплярах, особенно для таких вещей, как сообщения об ошибках.

Он может исходить из большего количества фона в стиле C, тогда как C # больше похож на java, чем что-либо другое.Либеральное использование классов допускается, даже поощряется.

...