2013-09-10 3 views
1

У меня есть программный поток, который довольно сложный, с множеством различных возможностей. Как это можно правильно запрограммировать, существует ли какой-либо стандартизированный метод преобразования этого в достойный код C#? С порядочным я имею в виду не один гигантский метод, полный заявлений if/else/goto.Управление и управление сложным потоком программы в C#

Будет ли это всегда быть какой-либо конструкцией if/else или мы можем использовать машину состояний/автомат? Я не знаю, как начать здесь.

Flow

+2

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

ответ

1

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

Basic setup

Details on workflow designing

Угробление консоль: Simple app using Windows Workflow and winforms NOT console

Next step would be passing parameters, I suppose.

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

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

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

@Bas Brekelmans, я видел ваш поток, и я сразу же понял, что Фундамент Workflow может вам помочь. Я помогу, насколько смогу.

Good Luck

+1

Специально предназначенный для работы FlowChart в WF4. Это позволит именно такой поток. http://www.develop.com/flowwf4 – Boranas

+0

Этот пример Switch @Boranas размещен^... У меня была долгая борьба с ним в моем случае. Я думаю, что я вырос на два года старше за 5 дней, прежде чем выяснять 1 против «1» – DoomerDGR8

+0

Workflows делает для кошмарной отладки. – DoomerDGR8

3

Вы более усложнять это.

Обратите внимание, что многие из узлов на вашей диаграмме являются той же функцией. После быстрого анализа вы хотите, чтобы некоторые классы с интерфейсами что-то вроде этого

// This is your credentials type 
class Credentials : ICredentials 
{ 
    static ICredentials Load(); 
    static void Save(ICredentials credentials, IPin pin); 
    static void Delete(ICredentials credentials); 
    bool Validate(); 
    bool CheckPin(IPin pin); 
} 

class Pin : IPin 
{ 
    static IPin Validate(string pin); 
} 

static class Internet 
{ 
    static bool Available { get; } 
} 

остального, и большинства, из работы включает в себя implmenting графического интерфейса.


Кроме того

Обратите внимание, что "Учетные еще действует?" «Нет» выбор должен вернуться к «Запросить учетные данные». Не имеет смысла создавать новые учетные данные без булавки.

+0

GUI должен вызывать каждое действие, наблюдать и отображать результаты. Графический интерфейс никогда не должен реализовывать специфику домена или бизнес-работу. Использование исключения (и обработки в пользовательском интерфейсе), если ваше интернет-соединение терпит неудачу, а затем отображение диалогов может быть лучше, чем проверка предварительного условия в вашей реализации. – Gusdor

+0

@ Гусдор согласился, лучший способ сделать это зависит от пользовательского интерфейса, который вам нужно создать, кто будет его использовать и для чего, и других факторов, таких как баланс между ремонтопригодностью, расширяемостью и прагматизмом. – Jodrell

0

Ваш код в целом будет всегда выражать все условные (если/else) логику, которые у вас есть. Но вы хотите, чтобы эти вопросы рассматривались отдельно, а не все в одном большом блоке.

Например, вопрос о том, является ли PIN-код действительным, несет ответственность класс, который проверяет PIN-коды. Было установлено, что вопрос о том, какой экран, который следует использовать после PIN-кода, может быть ответственным за класс, относящийся к навигации.

Так один простой способ структурирования это было бы:

  • ряд классов, относящиеся к бизнес-логики:

    • мандатной
    • Войти Session (ответственный за подсчет попыток и т. д.)
    • Булавка валидатор
    • Полномочия валидатор
    • требования сложности PIN Checker
    • Интернет-
    • Credentials Шторер
  • число экранных классов, делая свой графический интерфейс.

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

    Или, если вам не нравится эта единственная «навигатор» идея, вы могли бы дать каждому экранировать ViewModel, который знал только о бизнесе объектов, необходимых для этого экрана, и был ответствен за навигацию из это экран только. Таким образом, bahaviour вашего состояния машина распределяется между различными классами.

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