Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Poopy Joe, Вы писали:
S>
то есть часть про "if done poorly" вы пропустили. Ну, ок. С такой оговоркой я согласен.
Как же я пропустил, если специально цитату привел? Весь смысл в том, что даже плохо выполненный рефакторинг, все равно
рефакторинг. В твоей вселенной это нечто невозможное, по определению.
S>Я согласен с преимуществом простых определений. Но вы начинаете строить какие-то непонятные мне предположения:
То, что они тебе непонятные не говорит ровным счетом ни о чем, кроме того, что тебе они непонятные.
S>Нет, так не работает. В функциональных требованиях никто не упоминает вообще ничего про память. В 99% в требованиях к софту вообще нет ничего про память; в оставшемся проценте это часть нефункциональных требований, и формулируется она в стиле "должно запускаться на машине с 16GB RAM, 1GB места на диске".
Ну вот ты сейчас опять натягиваешь сову на глобус. Функциональные требования могут быть любые. Вообще. Не спрашивая твоего одобрения или твоей оценки их полезности.
S>Ни разу в жизни я не видел (и не надеюсь увидеть) оговорок в требованиях к софту насчёт граничных условий: типа "а вот тут, если кончилось место на диске, то приложение должно выдать вот такое-то сообщение".
Т.е. ты зная как "устроена жизнь" держишь голову в песке?

У нас такое сообщение есть и пользователи его регулярно видят. А почему оно тебя так пугает?
S>Такие вещи остаются за рамками требований, кроме очень специальных классов приложений. И ни разу отсутствие таких оговорок не служило поводом разбираться, типа "если вы не заложиди в согласованных с нами требованиях умение падать, когда не хватает памяти, адресного пространства, или места на диске, то вы обязаны не падать".
У нас есть требование работать без перезагрузки. Это просто невозможно выполнить, если память течет. И есть специальный duration test, где проверяется и это требование. Тестеры в жизни не пропустят версию, если увидят рост потребления памяти.
S>Да, код структурирован по другому. Вместо прямого вызова a == 3 происходит вызов делегата, внутри которого лежит ссылка на предикат "a => a==3".
Это другой код. Более того, в зависимости от реализации IEnumerable оно параллельным может стать.
S>Все три приведённые варианта — ленивые. Внезапности никакой не будет.
Все которые ты привел, но это не все которые решарпер поддерживает.
S>Надо просто внимательно смотреть, что именно делает этот рефакторинг.
Ну да, либо имеет целью изменить функциональные требования, либо нет. Больше ничего выдумывать не надо.
S>
Все делают всё делают на предположениях. Вы, когда объявляете ссылку not null, делаете предположение, что это соответствует реальным потребностям.
Нет, я выставляю контракт, что вот это поле никогда не будет null, и что все внутри будет валидным и уж точно это никак не связано с моделью.
S>Оно даже может быть справедливо — до определённого момента. А может быть неверным сразу, просто ваше исследование домена оказалось неполным. C'est la vie.
В этом случае его надо переделывать. И это тоже нормально. Вопрос в том насколько это сложно. Если делать не по феншую, то будет боль. Ты считаешь это нормальным, а я нет.
S>И даже монстры типа Microsoft регулярно бывают вынуждены откатывать назад апдейты своих публичных API — это что касается "не страдают".
Ну вряд ли они это считают нормальным.
S>Поэтому я скорее поверю в то, что это вы не понимаете, как устроена жизнь, чем в то, что я тут один такой дебил, а парни из Редмонда, Пало-Альто и Купертино просто забыли мне рассказать про книжки по DDD.
Ну я вот тебе пытался рассказывать, а ты просто не слушаешь. Может и они пытались.

С другой стороны чсв тебе явно жмет, если думаешь, что у всех голова болит как бы не забыть тебе все рассказать, чего ты не знаешь.
S>Ну, вы же написали, что у вас все модули независимые, и вы не хотели ограничивать фантазию авторов в плане записи конфигурации. Может вы и место не хотели ограничивать —
.
оопшники...
Разумеется их никто не ограничивает в выборе формата, и даже места внутри их песочницы. но кто же им даст
писать-то? Это ж сайд-эффект. Во-первых, они должны быть на границе системы, а во-вторых, кто ж доверит модулю, читай хрен с горы, изменять состояние системы?
Модуль определяет, грубо говоря, две функции save :: Data -> Path -> Result<> и load :: Version optional -> Path -> Result<>, делая частичное применение для остальных своих потребностей. Кто как и зачем их вызовет вне контроля модуля. Но, про версию он знать все равно должен, это в сигнатуре библиотечной функции, которая делает фактическую загрузку.