Рефакторинг кода Доброго времени суток! Есть у меня такая проблемка, хочу минимизировать код, да вот не знаю как. Точнее знаю, что через классы, но как именно - адекватного примера не нашел, или описания. Вот код: 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(); } } } Помогите разобраться, пожалуйста!
Сделать его проще. Т.е. в class вынести все основное, а в самой проге - просто ссылки на class. Вот, как-то так. Может, я просто не так выражаюсь.
мм, ээ..это называется рефакторинг кода Если дублирования кода нет то минимизировать особо нечего Чтобы правильно рефакторить надо хорошо понимать ООПэ А лаконичный код как правило со временем получается при должном знании языка
В точку. Рефакторинг. Сейчас вот даже книгу уже качаю, но все равно, хотелось бы хоть какой-то примерчик, исходя из кода выше.
там у тебя рефакторить практически нечего. anchor-ы можешь в Form1.Designer вынести. а юзать паттерны типа mvp/mvc из-за пары коннектов - просто нецелесообразно.
Ну, это всего лишь часть кода. Весь код тот, с которым Вы мне помогали в соседней теме про DataGrid. Мне говорили, можно как-то через класс-файлы, но я так и не понял(почитав Кристиана Гросса). Еще почитав Троелсена, нашел там автоматический, вроде как, рефакторинг, но тоже что-то не понял. Через класс-файлы думаю самое то.
хмммм, что ты подразумеваешь под класс-файлами? обычно каждый класс и пишется в отдельном .cs файле. если код действительно требует рефакторинга, взгляни на model-view-presenter.
Хм.. скажу так. Мне сказали код можно сделать проще, короче через классы, ссылки. Я по началу вроде понял, но как оказалось, понял не то.
Да что ты все к ООП прицепился-то? Что бы понять ООП, нужно не 1 раз что-то прочитать, а реально курить. Рефакторинг кода. Есть книги по этому. Читай.
М.Фаулер "Рефакторинг. Улучшение существующего кода" "Паттерны проектирования" - Банда четырех(всех авторов не помню) Это основные матсридные книги по этому вопросу Экспресс метода нету, у некоторых уходит немало времени чтобы все это понять и просветлиться. Вот у меня например прошло где-то полгода между тем как я написал свой первый класс и реально понял для чего собственно эти классы нужны и как их грамотно использовать.
Поддерживаю предыдущего оратора. Вообще ты должен всю логику вынести с гуя, сделать декаплинг, тогда и юнит тесты будут легко писаться и будет понятно где что лежит и не будет дублирования кода. Если есть знакомые хорошие программисты и им не впадлу потратить на тебя 20 30 мин. то давай им свой код на код ревью, так с ихними замечаниями быстрее разберешься где пишешь говнокод, а иначе можно и 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.
Пока сделал вот так: 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); Работает нормально. А вот остальное пока туго идет
менять в дизайнере (initializecomponents) ничего не стоит. свой код писать лучше в сам класс (Form1). классы пишутся каждый в своём cs файле. в твоём случае DataAccess.cs (кстати названия классов с большой буквы). я уже устал повторять про MVP pattern. для гуи - само то. состоит из 3-х частей: model, view, presenter. главный классс - presenter. он управляет юзер-интерфейсом и данными. UI ничего не знает о данных и наоборот. для этого в своей главной форме например в initializecomponents() создаёшь экземпляр класса presenter: Code: Presenter presenter = new Presenter(this); обрати внимание на this. этим самым ты передаёш экземпляр формы презентеру, тоесть знакомишь их. в конструкторе презентера создаёшь экземпляр своего DataAccess. теперь презентер может получать и передавать данные DataAccess-у и передавать их форме. так же презентер управляет формой в зависимости от обстоятельств и реагирует на события формы. вот и всё просто. если что непонятно, пиши тут вопросы.