Здравствуйте, Gangsta, Вы писали:
G>Я уже сделал как писал IT. По-моему там меньше гемора, нет?
Гораздо. Просто сейчас очень модно ругать наследование за якобы совершенно жуткое повышение связности кода и в результате на пустом месте изобретаются монстрики из десятков классов и интерфейсов.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Есть страница 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. Но не понятно как быть с веб-контролами, как к ним достучаться? Придется передавать их как аргументы к методам класса, но это не очень удобно, особенно когда контролов много
— Кодогенерация
Может быть кто-нибудь сталкивался с подобной задачей? Буду благодарен за любые предложения.
Здравствуйте, Gangsta, Вы писали:
G>- Делать класс X, который наследуется от System.Web.UI.UserControl. И потом уже tab1 и tab2 наследовать от этого класса X. Но не понятно как быть с веб-контролами, как к ним достучаться? Придется передавать их как аргументы к методам класса, но это не очень удобно, особенно когда контролов много
Сделай их виртуальными свойствами и перекрой в наследниках.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, 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
....
Можно тут присобачить еще что-нибудь более гибкое, типа инициализации контроллеров из конфигурационного файла.
Здравствуйте, Gangsta, Вы писали:
G>Я уже сделал как писал IT. По-моему там меньше гемора, нет?
Это зависит от самой задачи, наборов требований и возможность развития системы. Поэтому лучше, или хуже тот или иной вариант можно решить только зная полностью постановку и политику партии и правительства.
Здравствуйте, IT, Вы писали:
IT>Гораздо. Просто сейчас очень модно ругать наследование за якобы совершенно жуткое повышение связности кода и в результате на пустом месте изобретаются монстрики из десятков классов и интерфейсов.
Иногда модно, а иногда это жизнью диктуется. Если бы у меня были права, я бы тебе прислал бы куски кода. Индийцы отдыхают. Если не знать тех задач которые данный код решает, можно пересылать код в передачу "Что, Где и Когда". А решает он очень много задач. Слишком много.
Здравствуйте, GlebZ, Вы писали:
IT>>Гораздо. Просто сейчас очень модно ругать наследование за якобы совершенно жуткое повышение связности кода и в результате на пустом месте изобретаются монстрики из десятков классов и интерфейсов. GZ>Иногда модно, а иногда это жизнью диктуется.
В случае, о котором идёт речь, предложенный тобой вариант — это именно монстрик именно на пустом месте.
GZ>Если бы у меня были права, я бы тебе прислал бы куски кода. Индийцы отдыхают. Если не знать тех задач которые данный код решает, можно пересылать код в передачу "Что, Где и Когда". А решает он очень много задач. Слишком много.
Не надо мне твоего индусского кода, у меня своего выше крыши.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
GZ>>Если бы у меня были права, я бы тебе прислал бы куски кода. Индийцы отдыхают. Если не знать тех задач которые данный код решает, можно пересылать код в передачу "Что, Где и Когда". А решает он очень много задач. Слишком много.
IT>Не надо мне твоего индусского кода, у меня своего выше крыши.
Тогда присылай его в передачу, ннтересно будет посмотреть (шутка)