Jak obsługiwać interfejs aplikacji?

0

Witam

Zaczynam tworzyć aplikacje coraz bardziej rozbudowane graficznie używając dużej ilości kontrolek (przycisków, pół tekstowych, zakładek, etykiet etc.). Zastanawiam się w jaki sposób "ogarnąć" dość dużą ilość kontrolek, niestety nie odnalazłem nic sensownego stąd moje pytanie.

Stworzyłem aplikację z dość prostym interfejsem: 3 pola tekstowe, 2 przyciski i jedna etykieta.
Pola tekstowe służą do wprowadzania liczb przez użytkownika, jeden przycisk służy do wykonywania obliczeń na tych liczbach, drugi do wyczyszczenia pół tekstowych a w etykiecie pojawia się wynik.
user image

Kod mojego programu przedstawiam poniżej:

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnCalculate_Click(object sender, EventArgs e)
        {
            InterfaceHandling.Buttons.btnCalculateClick(this.lblResult, this.txtNumber1,this.txtNumber2,this.txtNumber3);
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            InterfaceHandling.Buttons.btnClearClick(this.txtNumber1, this.txtNumber2, this.txtNumber3);
        }
    }

    public static class InterfaceHandling //klasa obslugujaca interfejs aplikacji
    {
        public static class Buttons
        {
            public static void btnCalculateClick(Label plbl, TextBox pt1,TextBox pt2, TextBox pt3)
            {
                double a, b, c;
                double result;
                a = InterfaceHandling.TextBoxs.GetText(pt1);
                b = InterfaceHandling.TextBoxs.GetText(pt2);
                c = InterfaceHandling.TextBoxs.GetText(pt3);

                result = Calculations.Calculate(a, b, c);
                InterfaceHandling.Labels.SetText(plbl,result.ToString());
            }
            public static void btnClearClick(TextBox t1, TextBox t2, TextBox t3)
            {
                t1.Clear();
                t2.Clear();
                t3.Clear();
            }
        }
        public static class TextBoxs
        {
            public static double GetText(TextBox txtBox)
            {
                double res;
                res = Double.NaN;
                try
                {
                    res = Convert.ToDouble(txtBox.Text);
                }
                catch
                {
                    MessageBox.Show("Wprowadź liczbę");
                }
                return res;
            }
        }
        public static class Labels
        {
            public static void SetText(Label lbl, string text)
            {
                if (text != "NaN")
                {
                    lbl.Text = "Wynik: "+text;
                }
            }
        }
    }

    public static class Calculations
    {
        public static double Calculate(double pA, double pB, double pC)
        {
            double res = pA + pB + pC;
            return res;
        }
    }
}

Klasa InterfaceHandling odpowiada za "obsługę" wszystkich kontrolek. Kontrolki posegregowałem wg typu. Klasa Calculations odpowiada za wykonanie obliczeń.

Moje wątpliwości:

  1. Czy moje podejście do obsługi interfejsu jest poprawne?
  2. Nie podoba mi się przekazywanie w parametrach metody obiektów określających kontrolki
 
InterfaceHandling.Buttons.btnCalculateClick(this.lblResult, this.txtNumber1,this.txtNumber2,this.txtNumber3);
        

Czy można to jakoś zrobić lepiej?

Dziękuje za ewentualne poprawki i sugestie.

2
  1. Ani trochę.
  2. Słusznie, że Ci się nie podoba.

Dobrze, że nazywasz sensownie metody oraz kontrolki i próbujesz dzielić kod na klasy według ich przeznaczenia. Bardzo dobrze, że wydzieliłeś np. klasę Calculations.
Ale InterfaceHandling to jakieś nieporozumienie. Wydzielenie logiki prezentacji z code behind GUI do innej klasy to jest słuszna idea, ale aby to miało sen, nie można w logice prezentacji operować na elementach należących do technologii GUI. Czyli metody klasy InterfaceHandling nie powinny operować na Label ani TextBox tylko na typach danych.
Ogólnie, zamiast wynajdować koło na nowo, sugeruję zapoznać się z wzorcem MVP.

2
  1. Czy moje podejście do obsługi interfejsu jest poprawne?

Kodu nie czytam. Ale jeśli już pytasz o interfejs, to żeby program nadawał się do użytku:

  • kontrolki powinny być ułożone równo. korzystaj z przyciągających linijek w designerze - kiedy dwie kontrolki są idealnie względem siebie ułożone, pojawia się kreska
  • pola tekstowe powinny mieć etykietki, bo co to są za trzy pola - do czego służą?
  • wszystkie kontrolki powinny mieć aktywującą kombinację: klawisz+Alt (robi się to znakiem & w tekście kontrolki, wtedy następna litera jest podkreślana)
  • powinen być prawidłowo ustawiony "tab order", czyli żeby klawisz Tab przełączał po kontrolkach w sensownej kolejności

słowem: program ma się dać obsłużyć z klawiatury. to ile parametrów przyjmuje jakaś metoda jest kwestią drugorzędną.

0

Dzięki somekind. Teraz wiem jak do sprawy podejść.
Pozdrawiam
mch

1 użytkowników online, w tym zalogowanych: 0, gości: 1