Как избежать дублирования кода? (ASPX)
От: Gangsta  
Дата: 26.08.07 09:55
Оценка:
В дополнение к своему предыдущему посту
Автор: Gangsta
Дата: 23.08.07
хочу задать такой вопрос.

Есть страница submit.aspx, которая содержит в себе несколько юзер-контролов, которые визуально представляют собой табы:

tab1.ascx
tab2.ascx
tab3.ascx

tab1 у меня это т.н. Quick submit
tab2 это Advanced submit

между tab1 и tab2 не очень много разницы. Например, в tab2 добавлено всего лишь два дополнительных поля ввода. В сущности, tab2 почти повторяет (на данный момент (!)) tab1. Следовательно, получается дублирование кода. Все бы хорошо, но код tab1.ascx.cs это около 10кб различных функций. Этот код будет почти идентичным коду в tab2.ascx.cs

Мне бы не хотелось все это дублировать. Многие функции в tab1.ascx.cs напрямую обращаются к веб-контролам (к текстбоксам, чекбоксам и т.д.). Поэтому не знаю как написать такой класс (от которого можно унаследовать ascx-контрол) чтобы можно было обращаться напрямую к веб-контролам. Да и не получится его унаследовать, т.к. ascx веб-контрол наследуется от System.Web.UI.UserControl (а множественное наследование в C# не поддерживается).

Поэтому есть два решения, которые я вижу:
— Делать класс X, который наследуется от System.Web.UI.UserControl. И потом уже tab1 и tab2 наследовать от этого класса X. Но не понятно как быть с веб-контролами, как к ним достучаться? Придется передавать их как аргументы к методам класса, но это не очень удобно, особенно когда контролов много
— Кодогенерация

Может быть кто-нибудь сталкивался с подобной задачей? Буду благодарен за любые предложения.
Re: Как избежать дублирования кода? (ASPX)
От: IT Россия linq2db.com
Дата: 26.08.07 17:16
Оценка:
Здравствуйте, Gangsta, Вы писали:

G>- Делать класс X, который наследуется от System.Web.UI.UserControl. И потом уже tab1 и tab2 наследовать от этого класса X. Но не понятно как быть с веб-контролами, как к ним достучаться? Придется передавать их как аргументы к методам класса, но это не очень удобно, особенно когда контролов много


Сделай их виртуальными свойствами и перекрой в наследниках.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: Как избежать дублирования кода? (ASPX)
От: GlebZ Россия  
Дата: 30.08.07 23:00
Оценка:
Здравствуйте, Gangsta, Вы писали:

G>между tab1 и tab2 не очень много разницы. Например, в tab2 добавлено всего лишь два дополнительных поля ввода. В сущности, tab2 почти повторяет (на данный момент (!)) tab1.

Некоторая заметка. Я очень осторожно отношусь к наследованию/выделению различных режимов при работе с aspx/ascx. Если они не семантически эквивалентны, то при развитии начинается сильный бардак в котором очень трудно потом разобраться и сопровождать.
G>Мне бы не хотелось все это дублировать. Многие функции в tab1.ascx.cs напрямую обращаются к веб-контролам (к текстбоксам, чекбоксам и т.д.). Поэтому не знаю как написать такой класс (от которого можно унаследовать ascx-контрол) чтобы можно было обращаться напрямую к веб-контролам. Да и не получится его унаследовать, т.к. ascx веб-контрол наследуется от System.Web.UI.UserControl (а множественное наследование в C# не поддерживается).

G>Поэтому есть два решения, которые я вижу:

G>- Делать класс X, который наследуется от System.Web.UI.UserControl. И потом уже tab1 и tab2 наследовать от этого класса X. Но не понятно как быть с веб-контролами, как к ним достучаться? Придется передавать их как аргументы к методам класса, но это не очень удобно, особенно когда контролов много
Выделить, (обычно это не один, а набор классов), в отдельные классы общую и различную функциональность. Взаимодействие с ними осуществлять через интерфейсы.
Например.

public class tab1:IImportant
{
    public virtual IInitializer GetInitializer(){return new Initializer();}
    public void Page_Load(..)
    {
          GetInitializer().Initialize(this);
    }
    public void SetImportantCheckBox(bool b){importantCheckBox.Checked=true;}
}
public class tab2:tab1
{
    public override IInitializer GetInitializer(){return new Initializer1();}
}
public class Initializer:IInitializer
{
    public void Initialize(IImportant imp){
       .........
       SetImportantCheckBox(result);
    }
}
public class Initializer1:IInitializer
....

Можно тут присобачить еще что-нибудь более гибкое, типа инициализации контроллеров из конфигурационного файла.
Re[2]: Как избежать дублирования кода? (ASPX)
От: Gangsta  
Дата: 31.08.07 05:12
Оценка:
Здравствуйте, GlebZ, Вы писали:

...

Я уже сделал как писал IT. По-моему там меньше гемора, нет?
Re[3]: Как избежать дублирования кода? (ASPX)
От: IT Россия linq2db.com
Дата: 31.08.07 13:23
Оценка: +2 :)
Здравствуйте, Gangsta, Вы писали:

G>Я уже сделал как писал IT. По-моему там меньше гемора, нет?


Гораздо. Просто сейчас очень модно ругать наследование за якобы совершенно жуткое повышение связности кода и в результате на пустом месте изобретаются монстрики из десятков классов и интерфейсов.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Как избежать дублирования кода? (ASPX)
От: GlebZ Россия  
Дата: 31.08.07 16:07
Оценка:
Здравствуйте, Gangsta, Вы писали:

G>Я уже сделал как писал IT. По-моему там меньше гемора, нет?

Это зависит от самой задачи, наборов требований и возможность развития системы. Поэтому лучше, или хуже тот или иной вариант можно решить только зная полностью постановку и политику партии и правительства.
Re[4]: Как избежать дублирования кода? (ASPX)
От: GlebZ Россия  
Дата: 31.08.07 16:15
Оценка:
Здравствуйте, IT, Вы писали:

IT>Гораздо. Просто сейчас очень модно ругать наследование за якобы совершенно жуткое повышение связности кода и в результате на пустом месте изобретаются монстрики из десятков классов и интерфейсов.

Иногда модно, а иногда это жизнью диктуется. Если бы у меня были права, я бы тебе прислал бы куски кода. Индийцы отдыхают. Если не знать тех задач которые данный код решает, можно пересылать код в передачу "Что, Где и Когда". А решает он очень много задач. Слишком много.
Re[5]: Как избежать дублирования кода? (ASPX)
От: IT Россия linq2db.com
Дата: 31.08.07 16:43
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Гораздо. Просто сейчас очень модно ругать наследование за якобы совершенно жуткое повышение связности кода и в результате на пустом месте изобретаются монстрики из десятков классов и интерфейсов.

GZ>Иногда модно, а иногда это жизнью диктуется.

В случае, о котором идёт речь, предложенный тобой вариант — это именно монстрик именно на пустом месте.

GZ>Если бы у меня были права, я бы тебе прислал бы куски кода. Индийцы отдыхают. Если не знать тех задач которые данный код решает, можно пересылать код в передачу "Что, Где и Когда". А решает он очень много задач. Слишком много.


Не надо мне твоего индусского кода, у меня своего выше крыши.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Как избежать дублирования кода? (ASPX)
От: Gangsta  
Дата: 31.08.07 18:25
Оценка:
Здравствуйте, IT, Вы писали:

GZ>>Если бы у меня были права, я бы тебе прислал бы куски кода. Индийцы отдыхают. Если не знать тех задач которые данный код решает, можно пересылать код в передачу "Что, Где и Когда". А решает он очень много задач. Слишком много.


IT>Не надо мне твоего индусского кода, у меня своего выше крыши.


Тогда присылай его в передачу, ннтересно будет посмотреть (шутка)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.