2017-01-18 2 views
2

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

Что такое принципы разработки программного обеспечения или конкретные причины, почему я буду использовать так или иначе?

[кроме того, это существующее приложение стандартные WinForms, что только получение расширенной немного.]

Вариант А:

private void btnExport_Click(object sender, EventArgs e) 
{ 
    var FileName = getFileName(reportPrefix); 

    if (fileName == null)    
    { 
     return; 
    } 

    SaveFile(fileName, QueryString); 
} 

Вариант Б:

private void btnExport_Click(object sender, EventArgs e) 
{ 
    DoExport();   
} 


private void DoExport() 
{ 
    var FileName = getFileName(reportPrefix); 

    if (fileName == null)    
    { 
     return; 
    } 

    SaveFile(fileName, QueryString); 

} 
+3

Если вам нужно использовать 'DoExport' в нескольких местах, то вариант B имеет больше смысла. – BackDoorNoBaby

+0

используйте MVVM и привяжите команду к вашей модели. https://www.codeproject.com/articles/238657/how-to-use-commands-in-wpf – Fran

+1

Означает ли ОП, что он использует WPF? – BackDoorNoBaby

ответ

3

Я порекомендую для опции B по следующим причинам:

  1. Разделение концерна: Объект, который обрабатывает событие (EventHandler) или делегат Отдельно от фактической логики реализации, что делает фактическую работу и инкапсулируется в другом методе код ,

  2. Целью метода DoExport является ясное от его имени. Если кто-то прочитал ваш код, это будет интерпретироваться как

    Вариант B:«При нажатии кнопки« Экспорт ».
    Вариант A:«Когда кнопка нажата, прочитайте имя файла, если имя_файла пусто, затем верните, еще сохраните файл».

    Какой звук легче читать? Для цели удобочитаемости Вариант B обеспечил четкий и сжатый способ представления ваших намерений.

  3. Если вы решили изменить button на другой элемент управления, такой как anchor, linkButton, Label или любой другой элемент управления, вам не нужно связывать обработчик событий с деталями реализации. Как и метод DoExport, не следует полагаться на объекты отправителя EventArgs' or the.

  4. В будущем функция экспорта (DoExport) должна быть вызвана из других мест вашего кода. Затем вы можете легко вызвать метод DoExport.

  5. Тестирование: Если у вас есть этот метод как открытый, и вы хотите его протестировать. Гораздо проще протестировать метод, а не писать код, чтобы поднять событие, а затем проверить функциональность.

2

Ни, но B ближе, чем A:

SRP (Single Ответственность Принцип) рекомендовал бы, чтобы вы отделить бизнес-логику от пользовательского интерфейса, а не только на уровне метода, но по крайней мере, класс (разделение пространства имен и/или библиотеки может быть полезно). Это связано с тем, что пользовательский интерфейс, скорее всего, изменится независимо от изменений в логике экспорта.

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

И еще один класс полностью, предпочтительно за абстракцией, интерфейс идеально (DIP, Принцип инверсии зависимостей), отвечает за экспорт:

public class YouUIClass 
{ 
    IExporter exporter; 

    private void btnExport_Click(object sender, EventArgs e) 
    { 
     var fileName = GetFileName(reportPrefix); 

     if (fileName == null)    
     { 
      return; 
     } 
     exporter.DoExport(fileName);   
    } 
} 

public class Exporter : IExporter 
{ 
    public void DoExport(string fileName) 
    { 
     SaveFile(fileName, queryString); 
    } 
} 

(Вы, возможно, потребуется передать некоторые аргументы, как filename или queryString от пользовательского интерфейса до метода экспортера, как я показал, потому что я предполагаю, что GetFileName - это пользовательский интерфейс).

Одним из массивных преимуществ является то, что вы можете протестировать диск бизнес-логики без участия пользовательского интерфейса. Ручные тесты теперь просто проверяют, что пользовательский интерфейс правильно передает события на последующие слои.

Когда речь заходит о развязывании пользовательского интерфейса таким образом, есть некоторые шаблоны, которые вы можете отслеживать вокруг этого подхода, вместо того, чтобы катавать свои собственные шаблоны, такие как MVC, MVP & MVVM.

+1

Все где-то с заполнением пробелов в знаниях. :) –

+0

Уверенный :) хорошо, я бы порекомендовал вам заполнить некоторые СОЛИДНЫЕ пробелы с некоторым содержанием от дяди Боба: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod – weston

Смежные вопросы