Нужна концепция для приложений определенного типа в C # - PullRequest
0 голосов
/ 15 июня 2011

Я разработал приложение для Windows, в котором кнопка находится на форме, и при нажатии кнопки несколько последовательностей функций будут запускаться одна за другой, как показано ниже.

Button_Click()

{

function1();

function2();

function3();

function4();

function5();

function6();

function7();

function8();

function9();

function101();

function1();

function12();

function13();

} 

Каждая функция выполняет некоторые задания.так что мои приложения работают нормально, но мне нужно знать, как спроектировать такую ​​работу более структурированным способом.поэтому, пожалуйста, объясните мне, как структурировать, как я могу вызывать все функции один за другим.как опытный и опытный разработчик будет выполнять эти задания или как они будут вызывать функцию один за другим.спасибо

Ответы [ 4 ]

3 голосов
/ 15 июня 2011
  • Дайте своим существенным именам
  • Дайте своим сущностям осмысленные имена
  • Дайте своим сущностям осмысленные имена
  • Дайте своим сущностям осмысленные имена
  • Извлечение функций для общего кода
  • Возможно, вам нужны концепции сигналов / слотов / слушателей / наблюдателей.

edit: Рефакторинг Пример:

Предположим, ваш код:

void Button1_Click() {
    function1();
    function2();
    function3();
    function4();
    function5();
}    
void Button2_Checked(int variable0) {
    if (variable0) {
        function1();
        function2();
    } else {
        function1();
        function2();
        function3();     
        function4();
        function5();
    }
}

Шаг 0-10 - найти значимые имена для всех, кнопок, функций, переменные, параметры (переименовывать только одну сущность за раз; я пропустил это ради поста):

void orderPizzaButton_Click() {
    requestSalamis();
    requestAnchovis();        
    requestShitake();        
    requestCheese();
    requestGroundMeat();
}    
void lasagnePervesityLevel_Changed(int newValue) {
    if (newValue <= 0) {
        requestCheese();
        requestGroundMeat();
    } else {
        requestSalamis();
        requestAnchovis();        
        requestShitake();
        requestCheese();
        requestGroundMeat();
    }
}

Шаг 11 - найти общность в этих функциях и извлечь новую, многократно используемую функцию из них:

void orderPizzaButton_Click() {
    requestStrangeIngredientCombination();
}    
void lasagnePervesityLevel_Changed(int newValue) {
    if (newValue <= 0) {
        requestCheese();
        requestGroundMeat();
    } else {
        requestStrangeIngredientCombination();
    }
}

void requestStrangeIngredientCombination() {
    requestSalamis();
    requestAnchovis();        
    requestShitake();
    requestCheese();
    requestGroundMeat();
}

Шаг 12 - для уточнения поиска по общему коду (воспринимайте это как своего рода нормализацию):

void orderPizzaButton_Click() {
    requestStrangeIngredientCombination();
}
void lasagnePervesityLevel_Changed(int newValue) {
    if (newValue <= 0) {
        requestStandardComponents();
    } else {
        requestStrangeIngredientCombination();
    }
}

void requestStandardComponents() {
    requestCheese();
    requestGroundMeat();
}
void requestStrangeIngredientCombination() {
    requestSalamis();
    requestAnchovis();        
    requestShitake();
    requestStandardComponents();
}   

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

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

  • Рефакторинг - Улучшение дизайна существующего кода Мартина Фаулера из Аддисона-Уэсли
  • Стандарты кодирования C ++: 101 правила, руководящие указания и лучшие практики C ++ . Автор: Херб Саттер, Андрей Александреску (C ++ In-Depth series), Addison-Wesley
  • Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения Гаммы, Хелма, Джонсона, Влиссидеса (обычно называемого GoF, для Банды четырех), еще раз в Addison-Wesley
2 голосов
/ 15 июня 2011

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

Если нет: используйте шаблон pub / sub.

Если требуется конкретный заказ:

Не используйте функции, добавляйте функции к классам и используйте конвейер, как показано ниже.

public interface IPipeline
{
    void AddLast(IPipelineHandler handler);
    void AddFirst(IPipelineHandler handler);

    void Invoke(IPipelineContext context);
}

public interface IPipelineContext
{
   Form SourceForm {get; }

   // The result that the pipeline should produce.  (change from object to a specific type)
   object Result {get; }

   //and other properties that each handler will need.
}

public interface IPipelineHandler
{
    string Name {get; }
    void Process(IPipelineContext context);
}

В конвейерной реализации вызовите каждый обработчик с одинаковым контекстом:

public void Invoke(IPipelineContext context)
{
     foreach (handler in _handlers)
     {
        try
        {
             handler.Process(context);
        }
        catch (Exception err)
        {
            //abort or continue with the next handler?
        }
     }
}
0 голосов
/ 15 июня 2011

Какой ответ вы ожидаете?Не зная, как эти функции связаны друг с другом, никто не может ответить на этот вопрос.

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

Если у вас нет каких-либо из этих требований, я не вижу проблем с вашим текущим кодом.

Вам следует взглянуть на шаблоны проектирования, такие как Command Pattern илиШаблон «Трубы и фильтры», может быть, это вам поможет.

0 голосов
/ 15 июня 2011

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

Этотакже стоит присвоить более значимые имена вашим функциям, но я уверен, что вы называете их только как functionX () для примера.

Так, например:

Button_Click()
{
   Print()
}

private void Print()
{
  function1();
  function2();
  function3();
  function4();
  function5();
  function6();
  function7();
  function8();
  function9();
  function10();
  function11();
  function12();
  function13();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...