Как избежать переключения блока с 300 корпусами? - PullRequest
4 голосов
/ 30 сентября 2011

Я пытаюсь добавить 300 испытаний в свою программу, но отображаю их, только если CompletionValue.IsChecked = false;

Если вы создавали эту программу.Как бы вы хранили вызовы?Я использую коммутатор, но 300 случаев - это излишне, есть ли лучший способ?

Любая рекомендация по улучшению кода приветствуется.Я немного новичок в этом.

    Random rand = new Random();
    // Constructor
    public MainPage()
    {
        InitializeComponent();
        AnswerValue.Visibility = Visibility.Collapsed;
        Load();

    }


    private void Load()
    {
        int random = rand.Next(1, 4);
        switch (random)
        {
            case 1:
                Challenge1();
                break;
            case 2:
                Challenge2();
                break;
            case 3:
                Challenge3();
                break;
        }
    }

    private void Challenge1()
    {
        DifficultyValue.Text = "20%";
        CompletionValue.IsChecked = false;
        TitleValue.Text = "Chicken or Egg?";
        QuestionValue.Text = "Can you answer the ancient question: Which came first the chicken of the egg?";
        bmp.UriSource = new Uri("Images/Challenge1.png", UriKind.Relative);
        ImageValue.Source = bmp;
        ImageValue.Visibility = Visibility.Visible;
        ResourceValue.Text = "Resource: Brain Games";
        AnswerValue.Text = "The Egg. According to paleontologists, reptiles and dinosaurs existed long before birds and chickens.  Fossilized eggs dating back on hundred millions years have been uncovered. Thus it can be said that eggs came before chickens.";

    }

    private void Challenge2()
    {
        DifficultyValue.Text = "25%";
        CompletionValue.IsChecked = false;
        TitleValue.Text = "Halving Seven";
        QuestionValue.Text = "Can you prove that seven is half of twelve?";
        bmp.UriSource = new Uri("Images/Challenge2.png", UriKind.Relative);
        ImageValue.Source = bmp;
        ImageValue.Visibility = Visibility.Visible;
        ResourceValue.Text = "Resource: Yahoo Questions";
        AnswerValue.Text = "Roman numeral for 12 - XII \n Cut the roman numeral in half. you will get VII, which is 7.";

    }

    private void Challenge3()
    {
        DifficultyValue.Text = "25%";
        CompletionValue.IsChecked = false;
        TitleValue.Text = "Three-coin flip";
        QuestionValue.Text = "You ask a friend about probability, and he tells you the following: The odds of three tossed coins turning up all heads or all tails is one in two, that is, fifty-fifty. That’s because anytime you toss three coins, at least two must match, either two heads or two tails.  So that means the third coin—which is equally likely to be heads or tails—determines the odds.” Is your friend right? If not, what are the odds of three tossed coins turning up all heads or all tails?";
        bmp.UriSource = new Uri("Images/Challenge3.png", UriKind.Relative);
        ImageValue.Source = bmp;
        ImageValue.Visibility = Visibility.Visible;
        ResourceValue.Text = "Resource: Brain Games";
        AnswerValue.Text = "Answer will be available soon";
    }

Ответы [ 4 ]

6 голосов
/ 30 сентября 2011

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

Имея единое представление для ваших задач, вы настраиваете пользовательский интерфейс на основе данных запроса для конкретного идентификатора запроса.

Всегда можно переместить ваши данные в XML-файлы, JSON-файлы или базу данных, но сначала посмотрите, подходит ли вам простое решение C #:

// Note: This example is simplified for readability

// Here is the common data structure that can represent all challenges
private class Challenge
{
    public string Title { get; set; }
    public string Question { get; set; }
    public string ImagePath { get; set; }
}

// All of the challenges are defined right here, as simple data
private Challenge[] _allChallenges = new Challenge[]
{
    new Challenge
    {
        Title = "Chicken or Egg?",
        Question = "Can you answer the ancient question: Which came first the chicken of the egg?",
        ImagePath = "Images/Challenge1.png",
    },
    new Challenge
    {
        Title = "Halving Seven?",
        Question = "Can you prove that seven is half of twelve?",
        ImagePath = "Images/Challenge1.png",
    },
}

// Choosing challenges is as simple as indexing into the array
private void Load()
{
    int random = rand.Next(1, 4);
    Challenge chosenChallenge = _allChallenges[random];
    LoadChallenge(chosenChallenge);
}

// Setting up the UI for a challenge means extracting information from the data structure
private void LoadChallenge(Challenge chosenChallenge)
{
    TitleValue.Text = chosenChallenge.Title;
    QuestionValue.Text = chosenChallenge.Text;
    bmp.UriSource = new Uri(chosenChallenge.ImagePath, UriKind.Relative);
    ImageValue.Source = bmp;
    ImageValue.Visibility = Visibility.Visible;
}

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

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

4 голосов
/ 30 сентября 2011

Вы можете сохранить задачи в базе данных или в файле.Я вижу, вы используете случайное число и отображаете только 1 вызов.БД может быть что-то вроде

ChallengeId, DifficultyValue, TitleValue ... 

ChallengeId будет номером вопросаПоэтому в зависимости от сгенерированного случайного числа вы можете выбрать конкретный ChallengeId и соответствующие данные.

2 голосов
/ 30 сентября 2011

То, на что вам стоит обратить внимание, это инкапсуляция и полиморфный код. Инкапсулируя ваши одинаковые свойства в единый класс, вы получаете лучший способ представления «Задачи» в целом, а возможность многократно использовать части, которые вам приходится набирать снова и снова (.Text = "..."), сделает ваше будущее кодировать жизнь бесконечно лучше. Конечно, даже кодирование списка Challenge сущностей, как я изложил ниже, было бы неинтересно, вы должны когда-нибудь ввести эти данные где-нибудь. Мы просто собираемся считать это упражнением в кодировании, вы можете легко адаптировать приведенный ниже код для заполнения _challenges из базы данных или сериализованного файла.

public class Challenge
{
    public int Id {get;set;}
    public int Difficulty {get;set;}
    public bool IsCompleted {get;set;}
    public string Title {get;set;}
    public string Question {get;set;}
    public string Answer {get;set;}
}

public class MainPage
{
    private List<Challenge> _challenges;
    private Random rand = new Random();
    public MainPage()
    {
        _challenges = new List<Challenge> {
            new Challenge {
                    Id = 1,
                    Difficulty = 20,
                    Title = "What came first?",
                    Question =  "The chicken or the egg?",
                    Answer = "The egg." },
            new Challenge {
                    Id = 2,
                    Difficulty = 30,
                    Title = "Make 7 from 12?",
                    Question =  "Can you prove 7 is half of 12?",
                    Answer = "VII" }};
    }

    public void LoadChallenge(Challenge challenge)
    {
        Difficulty.Test = String.Format("%{0}", callenge.Difficulty);
        Completeted.Value = challenge.IsCompleted;
        Title.Test = challenge.Title;
        // etc
    }

    public void StartNewChallenge()
    {
        Challenge nextChallenge = null;
        while(nextChallenge == null)
        {
            var nextId = rand.Next(1,2);
            nextChallenge = _challenges
                .Where(x => x.Id == nextId && !x.IsCompleted)
                .SingleOrDefault(); // default to null if completed == true
        }
        LoadChallenge(nextChallenge);
    }

}
1 голос
/ 30 сентября 2011

Еще одной альтернативой может быть какой-то фабричный метод:

MyForm.cs

public class MyForm
{
    Random rand = new Random();
    // Constructor
    public MainPage()
    {
        InitializeComponent();
        AnswerValue.Visibility = Visibility.Collapsed;
        Load();
    }

    private void Load()
    {
        int random = rand.Next(1, 4);
        DisplayChallenge(ChallengeFactory.GetChallenge(random));
    }

    private void DisplayChallenge(ChallengeFactory.Challenge challengeToDisplay)
    {
        DifficultyValue.Text = String.Format("{0}%", challengeToDisplay.Difficulty);
        CompletionValue.IsChecked = challengeToDisplay.IsChecked;
        TitleValue.Text = challengeToDisplay.Title;
        QuestionValue.Text = challengeToDisplay.Question;
        ImageValue.Source = challengeToDisplay.ImageSource;
        ImageValue.Visibility = challengeToDisplay.Visible;
        ResourceValue.Text = challengeToDisplay.ResourceValue;
        AnswerValue.Text = challengeToDisplay.Answer;
    }
}

ChallengeFactory.cs

public static class ChallengeFactory
{
    public class Challenge
    {
        public int Difficulty { get; set; }
        public bool IsChecked { get; set; }
        public string Title { get; set; }
        public string Question { get; set; }
        public Uri ImageSource { get; set; }
        public bool Visible { get; set; }
        public string ResourceValue { get; set; }
        public string Answer { get; set; }

        private Challenge(int difficulty, bool isChecked, string title, string question, Uri imageSource, bool visible, string resourceValue, string answer)
        {
            // assign each of the arguments to the instance properties
        }
    }

    public static Challenge GetChallenge(int challengeNumber)
    {
        switch(challengeNumber)
        {
            case 1:
                return new Challenge(20, false, "Chicken or Egg?", "Can you answer the ancient question: Which came first the chicken of the egg?", new Uri("Images/Challenge1.png", UriKind.Relative), true, "Resource: Brain Games", "The Egg...");
            break;
            case 2:
                // new challenge for challenge #2
            break;
            case 3:
                // new challenge for challenge #3
            break;
        }
    }
}

Обратите внимание, что я сделал класс Challenge вложенным классом внутри класса Factory. Хорошая вещь в этом состоит в том, что вы можете сделать конструктор задачи private (что означает, что вы не можете создавать «недопустимые» типы вызовов с помощью чего-либо, кроме метода фабрики. Плохая вещь в этом состоит в том, что вам необходимо дополнительно квалифицировать класс Challenge, добавив к нему префикс, содержащий класс, то есть ChallengeFactory. дополнительный квалификатор в этом случае.

В конечном счете, я думаю, что вы застряли с необходимостью создать переключатель КУДА-ТО , если вы планируете определить все свои проблемы в коде. Как уже говорили другие, вы можете значительно сократить объем кода, который вам нужно написать (и, следовательно, переключить), определив свои проблемы во внешнем источнике данных (например, в базе данных) и имея один метод для чтения, анализа и создать Challenge экземпляр.

...