|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТо что рефлексией пользуются все сереализаторы это фэншуй? В самой рефлексии ничего плохого нет. Но если можно решить задачу без рефлексии, надо решать её без рефлексии. Dima TКак бы все хорошо, просто хотел еще лучше сделать. Вместо того чтобы выдавать исключение что метод не прописан - хочу проверять заранее. ХЗ чего вы все тут меня жизни учить собрались. Не мальчик уже. Ты странно реагируешь на критику. Никто тебя учить не собирается. Я высказал свои соображения и сказал, что не согласен с твоим утверждением. Dima TФормально ООП нарушаю, хотя тоже спорный вопрос. Если тоже самое сделаю через делегаты или интерфейсы и буду в базовом классе проверять предоставлен ли делегат/интерфейс, то будет фэншуй, ничего не изменится, но в дочернем классе будет больше букав. Почему ты хочешь решить задачу именно в дочернем классе? Если формально, процесс сохранения у тебя уже выделен в отдельный метод, значит его можно выделить в отдельный класс, например, как стратегию. И это полностью решает твои проблемы, совсем небольшой ценой. Ты можешь иметь несколько стратегий и применять к одной и той же реализации. Например, у тебя одна Работа, но разное Сохранение (в файлы разных типов, в базу данных..) Существует золотое правило: всегда отдавай предпочтение композиции вместо наследования. Если же ты монстрячишь иерархию классов, никогда не забывай про принцип замещения Лисков. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 21:45 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
А что никто не предложит впендюрить какой нибудь дурацкий IoC контейнер? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 22:26 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ЕвгенийВА что никто не предложит впендюрить какой нибудь дурацкий IoC контейнер? До этого ещё дожить надо ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2017, 22:47 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПочему ты хочешь решить задачу именно в дочернем классе? Если формально, процесс сохранения у тебя уже выделен в отдельный метод, значит его можно выделить в отдельный класс, например, как стратегию. И это полностью решает твои проблемы, совсем небольшой ценой. Ты можешь иметь несколько стратегий и применять к одной и той же реализации. Например, у тебя одна Работа, но разное Сохранение (в файлы разных типов, в базу данных..) Это конвертеры для интеграции нашей системы с клиентскими, у каждого клиента свои форматы обмена, они и прописываются в дочернем классе. Один дочерний класс удобен тем, что из его методов необходимо вызывать методы базового и методы дочернего иногда используют свои общие свойства/методы. Задача уже успешно решена именно дочерним классом. Эта сотня реализаций за 10 лет накопилась. Претензий к архитектуре за это время не возникло, поэтому нет смысла изобретать новый велосипед. Сейчас просто идет смена ЯП, т.е. переписывание с фокспро на C#. Причины вовсе не в архитектуре, а в том что у C# возможностей больше (многопоточность, юникод, скорость разбора файлов выше и т.д.) Нет цели переписать сразу все. То что работает - пускай дальше работает, а если возникает какая-то необходимость переписывания какой-то части функционала дочернего класса, то эта часть прописывается в новый конвертер, а старый продолжает заниматься остальным. Разделение функционала происходит на уровне инишников и/или параметров при запуске. Вобщем эпопея еще на 5-10 лет. Худшее что тут может произойти - новый конвертер заберет инфу, которую не сможет обработать. Для этого и надо проверку что обработка прописана. Можно конечно явно в коде флаги ставить, но к писателю тоже доверия мало, скопипастит установку флага из другого проекта, а метод не пропишет и получили мину замедленного действия: пока запускается как положено - все работает, запустили нестандартно - проимели инфу. Поэтому лучше через рефлексию порешать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 08:42 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TМожно конечно явно в коде флаги ставить, но к писателю тоже доверия мало, скопипастит установку флага из другого проекта, а метод не пропишет и получили мину замедленного действия: пока запускается как положено - все работает, запустили нестандартно - проимели инфу. Поэтому лучше через рефлексию порешать. Почему метод не сделать абстрактным, а не виртуальным, что заставит переопределять этот метод всегда, и проверять ничего будет не нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 10:01 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПочему метод не сделать абстрактным, а не виртуальным, что заставит переопределять этот метод всегда, и проверять ничего будет не нужно? я кажется догадываюсь и картина печальна. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 10:04 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПочему метод не сделать абстрактным, а не виртуальным, что заставит переопределять этот метод всегда, и проверять ничего будет не нужно? Потому что задача обратная: не "заставить прописать", а использовать только прописанное, чтобы переезжать с одного EXE на другой постепенно переписывая функционал, а не сразу все. Некогда этим долго заниматься, да и работа это дурная: писать лишь бы списать. Если уже написано и работает как надо, то пусть дальше работает. Потребуются изменения - тогда и писать. Пока писал мысль появилась как по другому порешать: по сути задача сводится к тому что всё, что не смог обработать новый конвертер, надо скормить старому, который знает что с этим делать. Тут проблема что старый не умеет вторым номером работать, но это можно допилить. Тогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку. И не надо будет ни флагов, ни рефлексии. Осталось оценить как много в старом допиливать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 12:19 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку а метод дочернего - не может просто вернуть логическое значение справился/не справился ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 12:52 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TТогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку. И не надо будет ни флагов, ни рефлексии. Осталось оценить как много в старом допиливать. Кажется ты начинаешь понимать, как устроен ООП :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:29 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Изопропила метод дочернего - не может просто вернуть логическое значение справился/не справился ? Это было бы слишком просто. Так не интересно ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:29 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ИзопропилDima TТогда все по фэншую будет: в базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку а метод дочернего - не может просто вернуть логическое значение справился/не справился ? Он исключение дает если не справился. Исключение ловится, в лог пишется, необработанная инфа остается в очереди на обработку. И так по кругу пока не обработается корректно или админ удалит из очереди. Эта схема нормально работает если дочерний метод прописан. Проблема в другом: инфа забирается с удалением на сервере и только затем запускается этот самый метод. В итоге имеем кучу ошибок в логе и инфа не забирается на обработку туда где есть обработчик. Не удалять с сервера пока не обработается - нельзя, т.к. это отдельная тема с переделкой сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:43 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttКажется ты начинаешь понимать, как устроен ООП :) ИМХО ООП на EXE-шниках это костыль покруче рефлексии :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 13:49 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TОн исключение дает если не справился. Речь не об исключениях -- это натуральная ошибка, а о сигнализации того, что задача не была выполнена. Т.е. в твоём случае, сохранение не было выполнено. Базовая реализация метода может возвращать всегда False, или объект с результатом и свойством Success. При переопределении, возвращаем успех, если всё хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 14:11 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TВ итоге имеем кучу ошибок в логе и инфа не забирается на обработку туда где есть обработчик. Не удалять с сервера пока не обработается - нельзя, т.к. это отдельная тема с переделкой сервера. так мух от котлет оделить нужно - не справился, потому что не умеет - это одно - направить старому обработчику, не справился, потому что ошибка (при обмене данными и тп) - писать в очереди, журналы и тп. Зачем это смешивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 14:37 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
ИзопропилDima TВ итоге имеем кучу ошибок в логе и инфа не забирается на обработку туда где есть обработчик. Не удалять с сервера пока не обработается - нельзя, т.к. это отдельная тема с переделкой сервера. так мух от котлет оделить нужно - не справился, потому что не умеет - это одно - направить старому обработчику, не справился, потому что ошибка (при обмене данными и тп) - писать в очереди, журналы и тп. Зачем это смешивать? Я о том же 20142734 читай внимательнее. Dima Tв базовом классе в виртуальном методе пропишу вызов старого EXE, тогда если метод перепрописан в дочернем, то он отработает, если нет - базовый вызовет старый EXE и отдаст инфу ему на обработку. может так понятнее Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Как только в Derived прописали, так сразу из Base перестал вызываться А вы мне тут оба про какие-то return false. У меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 15:12 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. Ну вообще-то есть. Штатные ситуации не должны решаться через исключения. И это не вопрос фломастеров, из адекватной команды с такими фломастерами гарантировано попрут на вольные хлеба. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 15:26 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttDima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. Ну вообще-то есть. Штатные ситуации не должны решаться через исключения. И это не вопрос фломастеров, из адекватной команды с такими фломастерами гарантировано попрут на вольные хлеба. Опять про фэншуй началось. Я писал применительно к конкретной задаче. Тут штатные ситуации: не качается потому что инет отпал, невозможно создать файл потому что прав нет или место на диске кончилось или путь в сеть а там перезагрузка и т.д. и т.п. Я не любитель исключений, но раз .Net сыпет разнообразными исключениями, то смысла нет к отлову их исключений добавлять свой способ передачи ошибок. Тем более что в 99% случаев вся обработка ошибки сводится к записи в лог. То что можно исправить, обычно исправляется непосредственно в том месте где обнаруживается. PS Тебя в команду разработчиков .Net надо заслать, пусть побольше методов TryXXX() понаделают. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 16:51 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TОпять про фэншуй началось. Я писал применительно к конкретной задаче. Какой ещё феншуй? Разработка, программирование, это инженерная дисциплина. Dima TЯ не любитель исключений, но раз .Net сыпет разнообразными исключениями, то смысла нет к отлову их исключений добавлять свой способ передачи ошибок. Тем более что в 99% случаев вся обработка ошибки сводится к записи в лог. То что можно исправить, обычно исправляется непосредственно в том месте где обнаруживается. Исключения не должны использоваться в ситуациях, которые ты ожидаешь. Например, некорректный ввод пользователя не должен порождать исключение. Просто ты в очередной раз высказал утверждение, с которым трудно согласиться, а именно: Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. Возврат и обработка ошибок не стоит делать через механизм исключений. Об этом написано у многих уважаемых авторов. И с опытом приходит понимание почему. Dima TPS Тебя в команду разработчиков .Net надо заслать, пусть побольше методов TryXXX() понаделают. Ну там их хватает. Кроме того, много чего можно проверить: наличие места на диске, наличие сетевого соединения, наличие прав для создания файла. И предусмотреть альтернативные варианты. Я понимаю, что такие проверки делать лень, проще поймать обобщённый Exception и записать его в лог. Но это не показатель, ни качественной разработки, ни профессионализма. Демонстрируя плохую практику, хотя бы подписывай, что да это говнокод, но с меня и не требуют другого. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 17:27 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. это и есть одна из причин появления болезненных идей ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 17:39 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
может метод представить как виртуальное свойство только для чтения с типом делегата. ты легко сможешь проверить, делегат базового класса задан для данного свойстве или какой то другой, от дечернего класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 17:44 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
И эти все танцы с бубном вместо классической "Strategy" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 18:41 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
hVosttПросто ты в очередной раз высказал утверждение, с которым трудно согласиться, а именно: Dima TУ меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. вот что отказывается зацепило. Давай договоримся на будущее: ты переспроси прежде чем выдернуть строчку из моего поста и на ее основе сделать далеко идущие выводы и на их основании меня тут критиковать и обсирать. У тебя домыслы неправильные, а я виноват. Чудесненько. Впиши в свой алгоритм телепатии что ТС всегда думает в рамках своей задачи, а не в рамках глобального мироустройства программирования, до которых ты раздул. Я в рамках своей задачи пишу, а ты раздуваешь не вникая. Про "фломастеры" было написано чтобы пресечь срачь по поводу обоих подходов. Извиняй, если не совсем корректно выразился, хотел поставить акцент на одно, получилось на другое. В целом лично я против исключений и это написал выше. Работать с ними особо не умею, т.к. до C# благополучно жил без них. В .Net они есть, приходится искать способы как с ними ужиться. Если уж цитировать, то так Dima TА вы мне тут оба про какие-то return false. У меня возврат и обработка ошибок в основном через исключения, это вопрос вкуса фломастеров, тут нет смысла его обсуждать. В данном случае речь о тех самых дочерних методах, которые делают одно из двух: 1. Получают от базового класса на вход объект, сериализуют специфическим образом и записывают в файл. 2. Получают на вход файл, десериализуют и отправляют объект в базовый класс для дальнейшей транспортировки. Тут возникает куча исключений, которые генерит .Net (файловый ввод-вывод, сеть). В первом случае моих исключений вообще нет. Во втором - я кидаю исключение если на входе полная лажа, которую невозможно разобрать. Стоит тут писать return false? Тем более что реакция на него точно такая же как на любое исключение - записать в лог. Я тебе это уже писал 20145681 . Ты читай все, а не только то что тебе хочется прочитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 20:23 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima T вот что отказывается зацепило. Давай договоримся на будущее: ты переспроси прежде чем выдернуть строчку из моего поста и на ее основе сделать далеко идущие выводы и на их основании меня тут критиковать и обсирать. Боже ж ты мой, никто тебя лично не обсирает и не критикует. Твои слова это не ты. Dima TУ тебя домыслы неправильные, а я виноват. Ты можешь это доказать? Неправильность моих слов? Если можешь, давай. Если не можешь, к чему это пустословие? Dima TРаботать с ними особо не умею, т.к. до C# благополучно жил без них. В .Net они есть, приходится искать способы как с ними ужиться. Если не особо умеешь, чего тогда сопротивляешься? Прими к сведению то, что тебе говорят, не обязательно всему слепо следовать. Это же обмен мнениями, обмен информацией. Очень плохо, если ты всё принимаешь на свой личный счёт и не можешь извлечь из этого выгоду. Dima T1. Получают от базового класса на вход объект, сериализуют специфическим образом и записывают в файл. 2. Получают на вход файл, десериализуют и отправляют объект в базовый класс для дальнейшей транспортировки. Эти задачи стоит разделить. Если сейчас тебе не сподручно, возьми на заметку, на будущее. Но не забывай, что технический долг рано или поздно ощутимо и больно бьёт в итоге, если проект у тебя на поддержке. Dima TВо втором - я кидаю исключение если на входе полная лажа, которую невозможно разобрать. Стоит тут писать return false? Тем более что реакция на него точно такая же как на любое исключение - записать в лог. Именно. Стоит возвращать результат об успехе операции, а не бросать исключение. Так ты задаёшь контракт использования. По сигнатуре функции видно, что надо ожидать результат и его обрабатывать. По сигнатуре функции не видно, какие ты там исключения собираешься бросать. Исключения, это исключительная ситуация, это значит, что произошло что-то такое, что программист не смог предусмотреть. Dima TЯ тебе это уже писал 20145681 . Ты читай все, а не только то что тебе хочется прочитать. Я прочитал, что ты нелюбитель исключений. Но это идёт вразрез с некоторыми твоими утверждениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 20:54 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Dima TВо втором - я кидаю исключение если на входе полная лажа, которую невозможно разобрать. Стоит тут писать return false? Тем более что реакция на него точно такая же как на любое исключение - записать в лог. отсутствие обработчика - относится к нормальному функционированию. Причём повтор бесполезен ( в отличие скажем от сетевой ошибки или переполнения диска) Спросил как сделать по-человечески - тебе ответили, а делать можешь как хочешь ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2017, 21:19 |
|
Можно определить прописан ли виртуальный метод в дочернем классе?
|
|||
---|---|---|---|
#18+
Если уж что-то обсуждать, то предметно, иначе словоблудие получается. мой проект упрощенноКод далеко не весь, только то что касается обсуждаемых исключений Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
Manage.ParseDoc1() это тот самый разбор формата конкретного клиента. Пишется индивидуально каждому. ТЗ по умолчанию: Каждый файл самодостаточен, никак не связан с остальными, порядок обработки файлов не имеет значения. Файл может быть удален только после успешной отправки, в остальных случаях надо писать ошибку в лог и сигналить админу. Дальше админ решает что делать: сам удалит, повторно сгенерит, руками поправит и т.д. и т.п. Т.е. снаружи метода ParseDoc1() можно только ошибки писать и тупо по кругу пытаться обработать. ParseDoc1() самодостаточен. Там может произойти любое исключение: от файловой системы, от используемых классов и т.д. Ловить их внутри неправильно по науке, т.к. ловить надо только то что можешь обработать, а обрабатывать ТЗ не разрешает, а необходимая инфа о проблеме уже содержится в исключении. Теперь про исключения написанные мной: например исключение Xml.XmlException может выдать XmlReader при разборе кривого XML, но в случае построчного разбора кривого TXT исключений нет, но я определяю что структура не соответствует ожидаемой, тут я считаю нужно выдать исключение, т.к. ситуация необрабатываемая. Причины исключений в генераторах этих файлов, если админ не в состоянии их устранить, то просто говорит что такая-то ошибка на таком-то виде файлов должна обрабатываться так-то, например перекладывать файл в другую папку. Это прописывается внутри ParseDoc1() ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2017, 13:06 |
|
|
start [/forum/topic.php?fid=20&msg=39391394&tid=1400091]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 281ms |
total: | 425ms |
0 / 0 |