На базе чего лучше всего продемонстрировать ООП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.10 14:56
Оценка:
Всем привет.

Пишу очередную (четвертую) часть Язык Nemerle.
Данная часть должна быть посвящена ООП-у.

К сожалению, в голову не приходит хороших идей для демонстрации ООП-а.

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

Я думал сделать WinForms-версию этого калькулятора, но оказалось, что это слишком простой пример, практически не демонстрирующий ООП. Вот как он выглядит:
using System.Windows.Forms;
using System.Drawing;

module Program
{
  Main() : void
  {
    def form               = Form();
    def expressionComboBox = ComboBox();
    def calculateButton    = Button();
    def resultTextBox      = TextBox();
    
    expressionComboBox.TabIndex  = 0;
    expressionComboBox.Bounds    = Rectangle(10, 10, 330, 30);
    
    calculateButton.AutoSize     = true;
    calculateButton.AutoSizeMode = AutoSizeMode.GrowAndShrink;
    calculateButton.TabIndex     = 1;
    calculateButton.Text         = "Calculate";
    calculateButton.Location     = Point(350, 10);
    
    resultTextBox.Location       = Point(10,  40);
    resultTextBox.Width          = calculateButton.Right - 20;
    resultTextBox.TabIndex       = 2;
    
    form.AcceptButton            = calculateButton;
    form.Text                    = "Calculator";

    form.Controls.Add(resultTextBox);
    form.Controls.Add(calculateButton);
    form.Controls.Add(expressionComboBox);

    form.ClientSize = Size(calculateButton.Right + 10, 
                           resultTextBox.Top + resultTextBox.Height + 10);
    
    calculateButton.Click += 
      fun(_, _)
      {
        def text = expressionComboBox.Text;
        def calc = CalcParser();
        
        def updateHistoryList()
        {
          def index = expressionComboBox.Items.IndexOf(text);
          
          when (index >= 0)
          {
            expressionComboBox.Items.RemoveAt(index);
            expressionComboBox.Text = text;
          }
            
          expressionComboBox.Items.Insert(0, text);
        }
        
        updateHistoryList();
        
        match (calc.ParseAndEval(text))
        {
          | Some(val) => resultTextBox.Text = val.ToString();
          | None      =>
            def (pos, msg) = calc.Error;
            
            resultTextBox.Text = msg;
            
            when (pos >= 0)
            {
              expressionComboBox.SelectionStart = pos;
              expressionComboBox.SelectionLength = 1;
              expressionComboBox.Select();
            }
        }
      };
    
    Application.EnableVisualStyles();
    Application.Run(form);
  }
}


Тут даже наследование не потребовалось (дизайнер форм им пользуется, но смысла в это — ноль).

Прошу подкинуть идей примеров в процессе реализации которых можно было бы продемонстрировать основные концепции ООП, точнее элементы языка используемые для поддержки ООП (они в Nemerle такие же как в C#).

Пример должен быть:
* Кратким. Я должен легко описать его в рамках одной статьи (10-15) страниц (по 5 тысяч знаков без учета пробелов).
* Он должен демонстрировать наследование, виртуальные методы, события. Хорошо бы, но не обязательно, чтобы он так же демонстрировал использование интерфейсов.
* Понятным.
* Не абстрактным и практичным. Меня самого всегда раздражало когда ООП подавали на совершенно не реалистичных примерах вроде построения иерархии животных или библиотеки графических примитивов (которые на практике никакого ООП не используют).
* Возможно, но не обязательно, связан с примером строчного калькулятор.

Одной из идей предложенной Воронковым было разработать электронную таблицу (аля сильно упрощенный Exel). Но боюсь, что это будет перебор.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.