Рефакторинг кода - CodeHelper

Рефакторинг кода

1

Доброго времени суток! Есть у меня такая проблемка, хочу минимизировать код, да вот не знаю как. Точнее знаю, что через классы, но как именно - адекватного примера не нашел, или описания.

Вот код:

public Form1()
    {
        InitializeComponent();

        button1.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
        textBox1.Anchor = (AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left);
        label1.Anchor = (AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left);
        textBox2.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
        label2.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
        dataGridView1.Anchor = (AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left);
        label3.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
        listBox1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right |  AnchorStyles.Left);

        /*---header---*/
        Column3.HeaderCell.Style.BackColor = System.Drawing.Color.Blue;
        Column3.HeaderCell.Style.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline);

        dataGridView1.AutoGenerateColumns = false;

        /*---Загрузка таблицы из базы---*/

        SqlConnection cn = new SqlConnection(strConn);
        SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn);
        try
        {
            cn.Open();
            SqlDataReader rdr = default(SqlDataReader);
            rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                dataGridView1.Rows.Add(rdr["FeedID"], rdr["Feed"], rdr["Nameoffeed"]);
            }
            rdr.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        finally
        {
            if ((cn != null))
            {
                cn.Close();
            }
        }

    }

Помогите разобраться, пожалуйста!!!

Новые ответы

Новые Лучшие

1

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

    SqlConnection cn = new SqlConnection(strConn);
    SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn);
    try
    {
        cn.Open();
        SqlDataReader rdr = default(SqlDataReader);
        rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            dataGridView1.Rows.Add(rdr["FeedID"], rdr["Feed"], rdr["Nameoffeed"]);
        }
        rdr.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    finally
    {
        if ((cn != null))
        {
            cn.Close();
        }
    }

Лучше написать:

using (SqlConnection cn = new SqlConnection(strConn))
using (SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn))
{
    try
    {
        cn.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            dataGridView1.Rows.Add(rdr["FeedID"], rdr["Feed"], rdr["Nameoffeed"]);
        }
        rdr.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

Как правило конструкция using экономит несолько строк.

2) Как правило если есть желание для участка кода написать комментарий типа /*Загрузка таблицы из базы*/ то лучше выделить этот участок в отдельный метод.

3

Готовое решение здесь, конечно, предложить сложно, но могу посоветовать несколько направлений.

Во-первых, нужно убрать чисто служебный код:

button1.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
textBox1.Anchor = (AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left);
label1.Anchor = (AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left);
textBox2.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
label2.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
dataGridView1.Anchor = (AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left);
label3.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);
listBox1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right |  AnchorStyles.Left);

/*---header---*/
Column3.HeaderCell.Style.BackColor = System.Drawing.Color.Blue;
Column3.HeaderCell.Style.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline);

Все эти действия (настройка внешнего вида и расположения компонентов) можно выполнить непосредственно в дизайнере формы. Тогда весь этот код переместиться в автогенерирующийся файл и не будет смешиваться с логикой формы (реакция на события и т.п.).

Во-вторых, основное зло приведённого кода (как и многих других WinForms-приложений) — наличие логики обращения к базе в коде формы. При нормальном подходе к архитектуре, эта логика должна инкапсулироваться в специальном классе. Если интересно, как архитектурно правильно реализовать настольное приложение, прочитайте классический труд Мартина Фаулера в пяти томах:

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

1) Создать класс предметной области:

public class Feed
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
}

2) Создать интерфейс для слоя доступа к данным:

public interface IFeedRepository
{
    IEnumerable<Feed> GetAllFeeds();
}

3) Создать реализацию интерфейса доступа к данным:

public class AdoNetFeedRepository : IFeedRepository
{
    // ...
    public IEnumerable<Feed> GetAllFeeds()
    {
        var result = new List<Feed>();
        SqlConnection cn = new SqlConnection(strConn);
        SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn);
        try
        {
            cn.Open();
            SqlDataReader rdr = default(SqlDataReader);
            rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                result.Add(new Feed
                {
                    Id = rdr["FeedID"],
                    Name = rdr["Nameoffeed"],
                    Url = rdr["Feed"]
                });
            }
            rdr.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        finally
        {
            if ((cn != null))
            {
                cn.Close();
            }
        }
        return result;
    }
}

4) На форме использовать созданный слой доступа к данным:

// ...
var allFeeds = feedRepository.GetAllFeeds();
foreach(var feed in allFeeds)
{
    dataGridView1.Rows.Add(feed.Id, feed.Url, feed.Name);
}

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.