Хорошая практика для проверки предметов в классе.

Я на самом деле нашел, что придать этой теме заголовок довольно сложно. В настоящее время я прохожу курс программирования в D # Net на C#. Перед нами была задача создать простую библиотеку, используя формы Windows и Entity Frameworks, используя шаблон службы репозитория.

У меня есть форма, в которой я добавляю сущность Book в базу данных, то есть добавляю новую книгу в библиотеку. То, что я делаю в этом классе, проверяет поля, чтобы убедиться, что пользователь действительно ввел какой-то текст, номер ISBN - правильный формат, книга еще не существует... Вы понимаете. То, что я пытался решить, - это как структурировать процессы. Когда я нажимал, чтобы отправить новую книгу, у меня изначально была куча операторов if в методе on_click, которые выполняют мою проверку.

private void btn_bookSubmit_Click(object sender, EventArgs e)
    {
        string  newBookName    = this.tb_bookTitle.Text;
        string  newBookAuthor  = this.tb_bookAuthor.Text;
        string  newBookISBN    = this.tb_bookISBN.Text;
        string  description    = this.tb_bookDesc.Text;



        if (bookIsNotValid(newBookISBN, newBookName, newBookAuthor))
        {
            MessageBox.Show(this.validationError);
            return;
        }
        if (bookService.BookTitleExists(newBookName))
        {
            MessageBox.Show("A book by this title already exists in the library");
            return;
        }
        if (bookService.ISBNExists(newBookISBN))
        {
            MessageBox.Show("This ISBN belongs to another book in the library.  Please double check the ISBN number and try again");
            return;
        }
        if (this.authorService.doesAuthorExistByName(newBookAuthor))
        {
            DialogResult result = MessageBox.Show
                ("This author does not exist in the database.  Do you want to add this author?",
                "Author Does not Exist", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes) this.authorService.addAuthor(newBookAuthor);
            if (result == DialogResult.No)
            {
                MessageBox.Show("New book entry cancled.  In order to enter a new book into the system a valid Author must be specified");
                return ;
            }
        }


        bookService.addBook(newBookISBN, newBookName, newBookAuthor, description);


        MessageBox.Show(
            string.Format("{0} succesfully added to the library", newBookName), 
            string.Format("{0} added Successfully", newBookName), 
            MessageBoxButtons.OK);

        this.clearFields(); 
    }

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

private void btn_bookSubmit_Click(object sender, EventArgs e)
    {
        string  newBookName    = this.tb_bookTitle.Text;
        string  newBookAuthor  = this.tb_bookAuthor.Text;
        string  newBookISBN    = this.tb_bookISBN.Text;
        string  description    = this.tb_bookDesc.Text;

        if (!isBookValid(newBookISBN, newBookName, newBookAuthor))  return;
        if (!isTitleValid(newBookName))                             return;
        if (!isISBNvalid(newBookISBN))                              return;
        if (!isAuthorNew(newBookAuthor))                            return;

        bookService.addBook(newBookISBN, newBookName, newBookAuthor, description);


        MessageBox.Show(
            string.Format("{0} succesfully added to the library", newBookName), 
            string.Format("{0} added Successfully", newBookName), 
            MessageBoxButtons.OK);

        this.clearFields(); 
    }

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

Я изучаю свою программу уже 2 года, пробовал javascript, php, html5, C++, C, а теперь C#, пытаясь понять, что мне нравится больше всего. Из всего программирования больше всего меня поразило то, что я люблю красивый и эффективный код. Возможно, я пока не смогу этого сделать, но я стараюсь изо всех сил выучить это. Так что о любых других дерьмовых практиках, которые вы можете заметить, пожалуйста, дайте мне знать Пока в классе все работает нормально, и мой реальный вопрос в том, хорошо ли я реализую свой процесс проверки? хорошо? хреново? медленный?

1 ответ

Решение

Хм, ваш книжный сервис не берет книжный объект?

Вместо того, чтобы ваша форма выполняла проверку того, что является действительной книгой, кажется, что она должна быть ответственна за Book класс, чтобы определить, является ли он действительным.

Некоторая проверка, например, если обязательное поле оставить пустым, может быть проблемой проверки на уровне формы... но многое из этого звучит как область обслуживания книги и / или класса книги.

Другие вопросы по тегам