Минимизация кода

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by F&D, 28 Sep 2010.

  1. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Рефакторинг кода

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

    Вот код:
    Code:
    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 F&D, 28 Sep 2010
    Last edited: 28 Sep 2010
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    что ты понимаешь под минимизацие кода?
     
  3. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Сделать его проще. Т.е. в class вынести все основное, а в самой проге - просто ссылки на class. Вот, как-то так. Может, я просто не так выражаюсь.
     
  4. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    мм, ээ..это называется рефакторинг кода
    Если дублирования кода нет то минимизировать особо нечего
    Чтобы правильно рефакторить надо хорошо понимать ООПэ
    А лаконичный код как правило со временем получается при должном знании языка
     
  5. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    В точку. Рефакторинг. Сейчас вот даже книгу уже качаю, но все равно, хотелось бы хоть какой-то примерчик, исходя из кода выше.
     
  6. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Кури примеры по паттернам проектирования. На C# полно примеров, даже на википедии
     
  7. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    там у тебя рефакторить практически нечего. anchor-ы можешь в Form1.Designer вынести. а юзать паттерны типа mvp/mvc из-за пары коннектов - просто нецелесообразно.
     
  8. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Ну, это всего лишь часть кода. Весь код тот, с которым Вы мне помогали в соседней теме про DataGrid. :)
    Мне говорили, можно как-то через класс-файлы, но я так и не понял(почитав Кристиана Гросса).

    Еще почитав Троелсена, нашел там автоматический, вроде как, рефакторинг, но тоже что-то не понял. Через класс-файлы думаю самое то.
     
    #8 F&D, 28 Sep 2010
    Last edited: 28 Sep 2010
  9. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    хмммм, что ты подразумеваешь под класс-файлами? обычно каждый класс и пишется в отдельном .cs файле. если код действительно требует рефакторинга, взгляни на model-view-presenter.
     
  10. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Хм.. скажу так. Мне сказали код можно сделать проще, короче через классы, ссылки. Я по началу вроде понял, но как оказалось, понял не то. :(
     
  11. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Может где-то можно почитать.. про классы, и как с их помощью оптимизировать прогу.
     
  12. .::f-duck::.

    .::f-duck::. Member

    Joined:
    30 May 2009
    Messages:
    343
    Likes Received:
    32
    Reputations:
    7
    Да что ты все к ООП прицепился-то?
    Что бы понять ООП, нужно не 1 раз что-то прочитать, а реально курить.
    Рефакторинг кода. Есть книги по этому. Читай.
     
  13. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    А есть экспресс-метод? просто очень срочно нужно..
     
  14. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    М.Фаулер "Рефакторинг. Улучшение существующего кода"
    "Паттерны проектирования" - Банда четырех(всех авторов не помню)
    Это основные матсридные книги по этому вопросу
    Экспресс метода нету, у некоторых уходит немало времени чтобы все это понять и просветлиться.
    Вот у меня например прошло где-то полгода между тем как я написал свой первый класс и реально понял для чего собственно эти классы нужны и как их грамотно использовать.
     
  15. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Поддерживаю предыдущего оратора.
    Вообще ты должен всю логику вынести с гуя, сделать декаплинг, тогда и юнит тесты будут легко писаться и будет понятно где что лежит и не будет дублирования кода.

    Если есть знакомые хорошие программисты и им не впадлу потратить на тебя 20 30 мин. то давай им свой код на код ревью, так с ихними замечаниями быстрее разберешься где пишешь говнокод, а иначе можно и 5 лет говнокодить без присмотра.
     
  16. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Code:
    public class Feed
    {
    	int _feedId;
    	public Feed(int iFeedId, strint sFeed, string sNameOffFeed)
    	{
    		FeedID = iFeedID;
    		Feed = sFeed;
    		NameOffFeed = sNameOffFeed
    	}
    	public int FeedID
    	{
    		set {_feedId = value;}
    		get {return _feedId;}
    	}
    	string _feed;
    	public string Feed{set/get}
    
    	strint _nameOffFeed;
    	public string NameOffFeed{set/get}
    
    }
    
    ------------------
    
    publis class DataLayer
    {
    	strint _srtConn;
    	public DataLayer(){str _strConn = GlobalResourse.StrConn};
    	public Feed[] GetTable()
    	{
                SqlConnection cn = new SqlConnection(_strConn);
                SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn);
                try
                {
                    Feed fd;
    		List<Feed> listFeeds = new List<Feed>();
    		cn.Open();
                    SqlDataReader rdr = default(SqlDataReader);
                    rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {	
    			fd = new Feed(rdr["FeedID"], rdr["Feed"], rdr["Nameoffeed"]);
                        listFeeds.Add(fd);
                    }
                    rdr.Close();
                }
                catch (Exception ex)
                {
                    //делать какойнить  throw экцепшен 
                }
                finally
                {
                    if ((cn != null))
                    {
                        cn.Close();
                    }
                }
    	}
    }
    
    ----------------
    public Form1()
    {
    	// кучу лейблов и текстбоксов сделать в виде отдельной форы
    	// и передевать ей тут только параметры
    	DataLayer dl = new DataLayer();
    	DataGridView1.DataSource = dl.GetTable()
    	DataGridView1.DataBind();
    }
    
    я думаю он об этом имел в виду когда говорил про классы :)

    Три уровня:
    DataLayer - работа с БД
    BussinesObject - вся логика программа
    Уровень представления - GUI

    Взаимосвязи между Уровнем представления и DataLayer БЫТЬ НЕ ДОЛЖНО.
    То что я написал это гавно :) потому что из как раз уровень представления работает с DataLayer ^_^
    Нужен еще один класс хранилище объектов Feed, который и работал бы с DataLayer, и в свою очередь с ним работал бы Form1.
     
    #16 cupper, 1 Oct 2010
    Last edited: 1 Oct 2010
  17. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Пока сделал вот так:
    Code:
    namespace RSS_Agregator
    {
    
        class dataAccess
        {
    
            string strConn = "server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd=123321";
    
            internal void gridViewFill(ref DataGridView dgv)
            {
                using (SqlConnection cn = new SqlConnection(strConn))
                {
                    SqlCommand cmd = new SqlCommand("Select FeedID, Feed, Nameoffeed FROM edik_1", cn);
                    try
                    {
                        cn.Open();
                        SqlDataReader rdr;
                        rdr = cmd.ExecuteReader();
                        while (rdr.Read())
                        {
                            dgv.Rows.Add(rdr["FeedID"], rdr["Feed"], rdr["Nameoffeed"]);
                        }
                        rdr.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
    и вынес этот класс в форму, в InitializeComponent():

    Code:
    InitializeComponent();   
         
    dataAccess da = new dataAccess();   
    da.gridViewFill(ref dataGridView1);
    
    Работает нормально. А вот остальное пока туго идет :(
     
  18. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    менять в дизайнере (initializecomponents) ничего не стоит. свой код писать лучше в сам класс (Form1). классы пишутся каждый в своём cs файле. в твоём случае DataAccess.cs (кстати названия классов с большой буквы).

    я уже устал повторять про MVP pattern. для гуи - само то.
    состоит из 3-х частей: model, view, presenter.
    главный классс - presenter. он управляет юзер-интерфейсом и данными. UI ничего не знает о данных и наоборот.
    для этого в своей главной форме например в initializecomponents() создаёшь экземпляр класса presenter:
    Code:
    Presenter presenter = new Presenter(this);
    обрати внимание на this. этим самым ты передаёш экземпляр формы презентеру, тоесть знакомишь их.
    в конструкторе презентера создаёшь экземпляр своего DataAccess. теперь презентер может получать и передавать данные DataAccess-у и передавать их форме. так же презентер управляет формой в зависимости от обстоятельств и реагирует на события формы.

    вот и всё просто. если что непонятно, пиши тут вопросы.