Как избежать дублирования кода в формах C#

Я полуновичок в С# и стараюсь избегать дублирования кода. У меня есть родительская форма и куча подформ. Все подчиненные формы содержат код, который сериализует текстовые поля и отправляет их в общий объект интерфейса:

public partial class Normal : UserControl
    {
    Interfacer normintobj = new Interfacer(STATCTRL.NORMDIST);
    public Normal()
    {
        InitializeComponent();
    }

    private void z_tb_KeyDown(object sender, KeyEventArgs e)
    {
        sendinfo(e,STATMAIN.VINP_Z_NORMAL);
    }

    private void serializethensendinfo()
    {
        normintobj.tbs[0] = UITest.testui(z_tb.Text);
        normintobj.tbs[1] = UITest.testui(Mean_tb.Text);
        normintobj.tbs[2] = UITest.testui(sd_tb.Text);
        normintobj.tbs[3] = UITest.testui(left_tb.Text);
        normintobj.tbs[4] = UITest.testui(tt_tb.Text);
    }

    private void unserializethensendinfo()
    {
        z_tb.Text    = Convert.ToString(normintobj.tbs[0]);
        Mean_tb.Text = Convert.ToString(normintobj.tbs[1]);
        sd_tb.Text = Convert.ToString(normintobj.tbs[2]);
        left_tb.Text = Convert.ToString(normintobj.tbs[3]);
        tt_tb.Text = Convert.ToString(normintobj.tbs[4]);
    }

    private void sendinfo(KeyEventArgs e,int field)
    {
        serializethensendinfo();
        normintobj.chk_tb_type(ref textBlock1, field, e);
        unserializethensendinfo();
    }

    private void sendinfo(int field)
    {
        serializethensendinfo();
        normintobj.chk_tb_type(ref textBlock1, field);
        unserializethensendinfo();
    }

    private void Mean_tb_KeyDown(object sender, KeyEventArgs e)
    {
        sendinfo(e,STATMAIN.NORMDIST_MID);
    }

    private void sd_tb_KeyDown(object sender, KeyEventArgs e)
    {
        sendinfo(e,STATMAIN.NORMDIST_MID);
    }

    private void left_tb_KeyDown(object sender, KeyEventArgs e)
    {
        sendinfo(e, STATMAIN.VOUT_LEFT_NORMAL);
    }

    private void tt_tb_KeyDown(object sender, KeyEventArgs e)
    {
        sendinfo(e,STATMAIN.VOUT_LEFT_NORMAL);
    }


    private void z_tb_LostFocus(object sender, RoutedEventArgs e)
    {
        sendinfo( STATMAIN.VINP_Z_NORMAL);
    }

    private void Mean_tb_LostFocus(object sender, RoutedEventArgs e)
    {
        sendinfo(STATMAIN.NORMDIST_MID);
    }

    private void sd_tb_LostFocus(object sender, RoutedEventArgs e)
    {
        sendinfo(STATMAIN.NORMDIST_MID);
    }

    private void left_tb_LostFocus(object sender, RoutedEventArgs e)
    {
        sendinfo(STATMAIN.VOUT_LEFT_NORMAL);
    }

    private void tt_tb_LostFocus(object sender, RoutedEventArgs e)
    {
        sendinfo(STATMAIN.VOUT_TWO_NORMAL);
    }

У меня есть реальная проблема с методами serializethensendinfo, unserializeandsendinfo и перегруженными методами sendinfo... Я вырезаю и вставляю одни и те же функции во все свои подчиненные формы (около 20 из них), но затем меняю имена текстовых полей. Как избежать дублирования кода, когда все текстовые поля имеют разные имена?


person Brent Rine    schedule 07.06.2011    source источник


Ответы (1)


Без нормализации текстовых полей на всех страницах и последующего переноса этих методов в базовый класс не так-то просто исправить ситуацию.

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

Это должно сократить дублирование логики, но вам все равно придется писать код.

private void serializethensendinfo( IEnumberable<TextBox> listOfTextBoxes )
{
    for( int i = 0; i < listOfTextBoxes.Count; i++ )
    {
       normintobj.tbs[i] = UITest.testui(listOfTextBoxes[i].Text);
    }    
}

private void unserializethensendinfo( IEnumberable<TextBox> listOfTextBoxes )
{
    for( int i = 0; i < listOfTextBoxes.Count; i++ )
    {
       listOfTextBoxes[i].Text = Convert.ToString(normintobj.tbs[i]);

       normintobj.tbs[i] = UITest.testui(listOfTextBoxes[i].Text);
    } 
}

Этот код не тестировался, и вам может потребоваться передать список по ссылке, чтобы вы могли писать обратно в текстовые поля.

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

person Brian Dishaw    schedule 07.06.2011