2012-06-07 2 views
2

Итак, у меня была простая программа, которая грубо нажимала кнопку, и она создавала задачу, ничего необычного, очень проста. Теперь я добавил для него еще много функций. Он выполняет около 5 различных основных более сложных задач. Задача имеет мало вклада в смысле, как общие примеры классов/пространств имен, касающиеся имени вставки, адреса, номера телефона и т. Д. Задача больше похожа на настройку параметров (отметьте/снимите флажки) о том, как вы хотите преформировать задание, а затем нажмите кнопку, чтобы преформировать его. Код вырос из-под контроля. Поэтому я сейчас пытаюсь его организовать. Я сам преподаю, поэтому у меня проблемы, но об этом я до сих пор думаю об организации. Любые комментарии о правильном способе организации этого будут оценены.C# Правильная структура программы

  • пространство имен NamespaceName
    • класс task1Name
      • методы task1
    • класса task1Name
      • методы task2
    • класс task2Name
      • методы Task3
    • класса task3Name
      • методы task4
    • класса task5Name
      • методы task5

Теперь у меня есть форма окна для программы и еще окна образуют в всплывающее окно настроек. Большой вопрос, где они точно вписываются? public partial class className: Form? Будет ли эта настройка позволять методам в разных классах задач по-прежнему взаимодействовать с элементом управления веб-браузером? Форма имеет пару элементов управления веб-браузером, и задача выполняется в элементе управления веб-браузером.

Я предполагаю, что в общем, я просто пытаюсь найти лучший способ управлять кодом и правильно настроить/структурировать код. От чтения этого How to use separate .cs files in C#?, возможно, я просто придерживаюсь одного класса/файла, так как задача включает в себя веб-браузер в форме окна.

Ive смотрел на http://msdn.microsoft.com/en-us/library/w2a9a9s3%28v=vs.100%29.aspx и соответствующие разделы, перечисленные ниже примере кода

+0

Связаны ли эти задачи? Или вы можете нарезать эту штуку на несколько целенаправленных программ? – bluevector

+0

Задача раздельная, так как они не обмениваются между собой, но, в общем, связаны с этим, я думаю, вы могли бы сказать. Моя цель - установить параметры задач, а затем свернуть к системному ловушку и запустить задачи в фоновом режиме в течение дня. Может быть, я просто пытаюсь найти лучший способ управлять кодом? – Delirious

+0

Это код, который перепутал или пользовательский интерфейс? Один порождает другого. Это то, что вам только нужно? – bluevector

ответ

2

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

Важнейшим советом является реставратор в небольших, автономных шагах.

Существует несколько способов начать это. Если вам нужны подробные рекомендации, это поможет узнать, как выглядит код. Например, каковы подписи «задачи» (их имена, аргументы и тип возврата) и как они взаимодействуют с «настройками».

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

Ваш код будет выглядеть примерно так: EDIT: Я забыл, что элемент управления WebBrowser должен быть передан в задачи. Исправлена.

// Note: All classes and structs go in the same namespace, but each goes in its own .cs file. 

// Use a struct, rather than a class, when you just need a small set of values to pass around 
struct MySettings 
{ 
    public int NumberOfWidgets { get; set; } 
    public string GadgetFilename { get; set; } 
    public bool LaunchRocket { get; set; } 
} 

partial class MyForm 
{ 
    // ...constructor, etc. 

    private void ButtonForTask1_Clicked(object sender, EventArgs e) 
    { 
     var settings = ReadSettingsFromControls(); 
     var task1 = new Task1(settings); 
     task1.DoTheTask(ref this.WebBrowserControl1); 
    } 

    private void ButtonForTask2_Clicked(object sender, EventArgs e) 
    { 
     var settings = ReadSettingsFromControls(); 
     var task2 = new Task2(settings); 
     task2.DoTheTask(ref this.WebBrowserControl1); 
    } 

    // ... and so on for the other tasks 

    private MySettings ReadSettingsFromControls() 
    { 
     return new MySettings 
     { 
      NumberOfWidgets = int.Parse(this.txt_NumWidgetsTextBox.Text), 
      GadgetFilename = this.txt_GadgetFilenameTextBox.Text, 
      LaunchRocket = this.chk_LaunchPermission.Checked 
     }; 
    } 
} 

class Task1 
{ 
    // Readonly so it can only be set in the constructor. 
    // (You generally don't want settings changing while you're running. :)) 
    private readonly MySettings _settings; 

    public Task1(MySettings settings) 
    { 
     _settings = settings; 
    } 

    public void DoTheTask(ref WebBrowser browserControl) 
    { 
     // TODO: Do something with _settings.NumberOfWidgets and browserControl 
     // You can use private helper methods in this class to break out the work better 
    } 
} 

class Task2 { /* Like Task1... */ } 

Надежда, что помогает! Опять же, если вы разместите какой-то пример кода, вы, вероятно, получите гораздо лучший совет о том, как его реорганизовать.

+0

Второй наиболее важный совет - использовать *** USER SOURCE CONTROL ***, чтобы отслеживать изменения, которые вы делаете. Если вы этого еще не сделали, перейдите на страницу http://hginit.com/01.html прямо сейчас. Это отличный учебник для бесплатной системы управления исходным кодом Mercurial с открытым исходным кодом, которую вы можете получить для Windows по адресу http://tortoisehg.bitbucket.org/. –

+0

Спасибо за ваш комментарий! Я решил пойти дальше и начать организовывать и разделять код. Кроме того, я не использовал источник управления, так что это тоже приятное дополнение. Ive получил как 5 копий программы в разных точках, так что это будет хороший способ сохранить это в порядке. – Delirious

+0

Добро пожаловать! Сообщите нам о любых проблемах во время рефакторинга (связанного с кодом или источником). И, пожалуйста, не забудьте проголосовать и принять полезные комментарии и ответы. :) –

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