Форум
Философия программирования
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, Sinclair, Вы писали: S>Здравствуйте, AndrewVK, Вы писали: AVK>>Не вижу никакого взрыва. Этот код просто лапочка по сравнению с тем, что местами попадается, скажем, в решарпере :) Типа нескольких вложенных циклов по графу, на который наложены и неявно учитываются контролируемые только в рантайме ограничения, внутри которых несколько goto, причем в разные точки. Вот это да, взрыв моска. А тут линейная логика. AVK>>Ну давай посмотрим: AVK>>[c#] AVK>>IInventoryCardObject invCardObj = invAfter.GetInventoryCardObject(); AVK>>[/c#] AVK>>Получаем объект инвентаризации из истории операции инвентаризации S>1. Почему у нас явно указан тип? Это важно? (здесь и далее все комментарии - с точки зрения бизнес-логики, а не с точки зрения C# AVK>>[c#] AVK>>if (invCardObj != null) AVK>>[/c#] AVK>>Если объект есть S>2. У нас он часто отсутствует? S>3. Если он отсутствует, то выполняется какая-то сложная логика, или просто "а, ну тогда пропустим тридцать строк"? S>4. Я веду к тому, что может имеет смысл свернуть эти явные ветки кода во что-то типа "для всех карточек (которых либо 0 либо 1) выполни XXX", либо перейти от null к исключениям, которые можно удобно проигнорировать где-то внизу кода (типа OnMissingInvCard = Skip). AVK>>[c#] AVK>>var card = ((IPersistedObject)invCardObj).Master as IInventoryCardBase; AVK>>[/c#] AVK>>Берем карточку, по которой он инвентаризован S>5. Вот эти два даункаста в разных стилях - они точно нужны? Почему нельзя просто invCardObj.Master? AVK>>[c#] AVK>>if (card is IAccrualAccountingInventoryCard) AVK>> Manager.DeleteObject((IPersistedObject)invCardObj); AVK>>[/c#] S>6. Опять даункаст. В целом, выглядит, как размазанная запись правила, которое в оригинале звучало как "убить все карточки, которые входят в бла-бла-бла". DSL, который бы позволял написать "убить все карточки, которые входят в бла-бла-бла", не отвлекаясь на порядок обхода итераторов, даункасты, и скобочки, был бы крайне уместен. AVK>>[c#] AVK>>else if (!cardsDeleteSet.Contains(card)) AVK>> invCardObj.Inventory = inv; AVK>>[/c#] AVK>>Иначе проверяем наличие в хешике, который мы чуть раньше заполняли, и если совпало, то в детейле инвентарной карточки заменяем ссылку на справочник инвентаризуемых объектов. S>7. Этот хешик - он какую бизнес-сущность отражает? AVK>>[c#] AVK>>inv.ChangesHistory = null; AVK>>[/c#] AVK>>Обнуляем историю инвентаризации S>Хм. Не вполне очевидно. AVK>>[c#] AVK>>ChangeInventoryActualStateInDocuments(invAfter, inv); AVK>>[/c#] AVK>>Название метода вполне говорящее. AVK>>[c#] AVK>>Manager.DeleteObject((IPersistedObject)invAfter); AVK>>[/c#] AVK>>Удаляем инвентаризационную операцию AVK>>Это, собственно, типичная бизнес-логика. Далеко не самая запутанная, уж поверь. И ее то как раз нужно сохранить, это входящее требование. А вот как ее более красиво записать - вопрос. S>Отож, про то и обсуждение. AVK>>Где? В DeleteObject даункаст лишний. Даункаст при обращении к Master - технологическая особенность, связанная с распределенностью системы и едиными интерфесами и в клиентском и в серверном коде. Согласен, проблема, но ее не так то легко вылечить. А as/is - это просто проверка дискриминанта, который выражен в виде реализации тех или иных интерфейсов. S>С точки зрения C# - понятно. С точки зрения бизнес-логики - нет. AVK>>Переменная модифицируется ровно один раз, при объявлении. Потом меняется содержимое самого хеша, а не переменной. И использование вполне стандартное - запоминаем в цикле обхода, потом запомненное используем для проверки. Такого кода, скажем, внутри System.Enumerable до попы, хотя, вроде как, весьма приличные спецы писали. S>Тут дело не в спецах, а в решаемой задаче. S>Не то, чтобы у меня было готовое решение для вашей бизнес-логики, просто невооружонным мозгом понять код на шарпе всё же тяжело. Относительнно много мусора и сущностей, которые как бы вне модели собственно бизнеса.
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …