Антипаттерн, противоположный Primitive Obsession
От: T4r4sB Россия  
Дата: 17.03.23 18:10
Оценка:
Ну короче тут наверное многие знают, и любой может нагуглить, что такое Primitive Obsession — это когда везде используются инты и строки, и из-за этого иногда случается фигня, когда секунды складываются с килограммами, а в емейл записывается заведомо невалидная строка.
А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию, из-за которой даже нельзя блин сложить два вектора, потому что складывать можно только вектор и точку, а если таки надо сложить два вектора, то надо после получаса попыток заставить компилятор собрать код таки узнать, что надо использовать my_vector_lib::my_vector::point_cast<my_vector_lib::my_vector::point<std::ratio<1, 1000000000>>> на одном из них? Причём даже если для этой абракадабры есть простой алиас типа my_vector_lib::my_vector::millimeter_cast, то из сообщений компилятора это узнать невозможно, и это надо обязательно зазубрить.
Re: Антипаттерн, противоположный Primitive Obsession
От: ononim  
Дата: 17.03.23 21:25
Оценка: +1
TB>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию
звучит как std::chrono
Как много веселых ребят, и все делают велосипед...
Re: Антипаттерн, противоположный Primitive Obsession
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.03.23 21:41
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию, из-за которой даже нельзя блин сложить два вектора, потому что складывать можно только вектор и точку...


Это называется DDD
Re[2]: Антипаттерн, противоположный Primitive Obsession
От: T4r4sB Россия  
Дата: 17.03.23 21:54
Оценка:
Здравствуйте, ononim, Вы писали:

TB>>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию

O>звучит как std::chrono

Тема действительно вдохновлена этой либой, но дело ж не только в ней. Пример, когда векторы и точки — это разные типы — придумал не я, такая дичь реально есть, и пользоваться ей просто невозможно.
Ну и подобная одержимость каждую хрень завернуть в свою обёртку свойственна в сообществе языка rust. Я просто не знаю, есть ли научное объяснение, почему так делать во многих случаях плохо, особенно если ты не пишешь прошивку ядерного реактора, пассажирского самолёта или медицинского аппарата.
Re[2]: Антипаттерн, противоположный Primitive Obsession
От: T4r4sB Россия  
Дата: 17.03.23 21:55
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, T4r4sB, Вы писали:


TB>>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию, из-за которой даже нельзя блин сложить два вектора, потому что складывать можно только вектор и точку...


G>Это называется DDD


Domain Driven Design?
Re[3]: Антипаттерн, противоположный Primitive Obsession
От: Слава  
Дата: 18.03.23 04:56
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>>>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию


Очень жаль, что в былые времена стал столь популярен язык си от пары телефонистов. Дали же людям Аду с newtype — так нет, они продолжили упорствовать, халтурщики.

TB>Тема действительно вдохновлена этой либой, но дело ж не только в ней. Пример, когда векторы и точки — это разные типы — придумал не я, такая дичь реально есть, и пользоваться ей просто невозможно.

TB>Ну и подобная одержимость каждую хрень завернуть в свою обёртку свойственна в сообществе языка rust. Я просто не знаю, есть ли научное объяснение, почему так делать во многих случаях плохо, особенно если ты не пишешь прошивку ядерного реактора, пассажирского самолёта или медицинского аппарата.

Это хорошо. Особеннно чтобы "нужды бизнеса" не удовлеторялись столь быстро. Потому что пока идёт разработка, можно будет подумать, а нужны ли вообще эти нужды.
Re[2]: Антипаттерн, противоположный Primitive Obsession
От: CreatorCray  
Дата: 18.03.23 07:45
Оценка: :))
Здравствуйте, gandjustas, Вы писали:

G>Это называется DDD

Debil Driven Development?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Антипаттерн, противоположный Primitive Obsession
От: CreatorCray  
Дата: 18.03.23 07:45
Оценка: :)))
Здравствуйте, T4r4sB, Вы писали:

TB>А как называется противоположный антипаттерн?

Как правило нецензурно
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Антипаттерн, противоположный Primitive Obsession
От: sambl74 Россия  
Дата: 18.03.23 09:12
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну короче тут наверное многие знают, и любой может нагуглить, что такое Primitive Obsession — это когда везде используются инты и строки, и из-за этого иногда случается фигня, когда секунды складываются с килограммами, а в емейл записывается заведомо невалидная строка.

TB>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию, из-за которой даже нельзя блин сложить два вектора, потому что складывать можно только вектор и точку, а если таки надо сложить два вектора, то надо после получаса попыток заставить компилятор собрать код таки узнать, что надо использовать my_vector_lib::my_vector::point_cast<my_vector_lib::my_vector::point<std::ratio<1, 1000000000>>> на одном из них? Причём даже если для этой абракадабры есть простой алиас типа my_vector_lib::my_vector::millimeter_cast, то из сообщений компилятора это узнать невозможно, и это надо обязательно зазубрить.

Это похоже на венгерскую нотификацию на максималках — как она изначально была задумана https://www.joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong/
Re[3]: Антипаттерн, противоположный Primitive Obsession
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.03.23 10:39
Оценка:
Здравствуйте, T4r4sB, Вы писали:

G>>Это называется DDD

TB>Domain Driven Design?

Да
Re[2]: Антипаттерн, противоположный Primitive Obsession
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.03.23 10:52
Оценка:
Здравствуйте, sambl74, Вы писали:

Все пошло отсюда https://blog.janestreet.com/effective-ml-revisited/

Изначально это было фишкой для ФЯ вроде ocaml и haskell, а потом с подачи товарища Волшина идею "make illegal states unrepresentable" привязали к domain modeling with types (независимо от языка) https://fsharpforfunandprofit.com/posts/designing-with-types-making-illegal-states-unrepresentable/.

DDD пропагандирует именно domain modeling with types в рамках ОО-языков, поэтому идеи типизации такого рода прижились.
Re[3]: Антипаттерн, противоположный Primitive Obsession
От: T4r4sB Россия  
Дата: 18.03.23 11:41
Оценка: :))
Здравствуйте, gandjustas, Вы писали:

G>а потом с подачи товарища Волшина идею "make illegal states unrepresentable"


А как этот долбаный фанатик собирается писать банальную задачу "прибавить к позиции шахматной фигуры смещение и проверить валидность результата"? Ведь согласно его идеям позиция шахматной фигуры должна иметь тип [0..8), а смещение должно иметь тип [-7 ..7], и складывать их нельзя, и любая попытка скастить одно к другому вызовет исключение в некоторых случаях.
То есть он предлагает что-то типа

try_cast_or_throw<Position>((position as int) + (offset as int))

?

Чем его, сцуко, изначально не устраивает хранить всё в обычных интах? Пошёл он нахер со своими паттернами!
Re[4]: Антипаттерн, противоположный Primitive Obsession
От: T4r4sB Россия  
Дата: 18.03.23 11:50
Оценка:
Здравствуйте, Слава, Вы писали:

С>Очень жаль, что в былые времена стал столь популярен язык си от пары телефонистов. Дали же людям Аду с newtype — так нет, они продолжили упорствовать, халтурщики.


Потому что если отладить все баги быстрее, чем разгадать все загадки компилятора, то быстрее отладить все баги. К тому же в них логику часто проще найти.
Re[4]: Антипаттерн, противоположный Primitive Obsession
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.03.23 14:58
Оценка: +3
Здравствуйте, T4r4sB, Вы писали:

TB>А как этот долбаный фанатик собирается писать банальную задачу "прибавить к позиции шахматной фигуры смещение и проверить валидность результата"? Ведь согласно его идеям позиция шахматной фигуры должна иметь тип [0..8), а смещение должно иметь тип [-7 ..7], и складывать их нельзя, и любая попытка скастить одно к другому вызовет исключение в некоторых случаях.

TB>То есть он предлагает что-то типа

TB>
TB>try_cast_or_throw<Position>((position as int) + (offset as int))
TB>

TB>?
Не знаю, что там Волшин, а в нормальных языках и библиотеках оператор + просто определяется для (position, offset)->position и (offset, offset)->offset.
Зачем городить преобразования туда-обратно мне решительно непонятно. Задача отличается от алгебры поверх DateTime / TimeSpan исключительно дополнительными ограничениями на диапазон валидных значений.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Антипаттерн, противоположный Primitive Obsession
От: scf  
Дата: 18.03.23 17:44
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

TB>А как называется противоположный антипаттерн? Это когда некий долбаный хипстер везде нагородил сраную овертипизацию, из-за которой даже нельзя блин сложить два вектора, потому что складывать можно только вектор и точку


Это называется "плохой дизайн". Когда автор определенные операции либо не предусмотрел, либо предусмотрел так, что без документации их не найти.
Еще это называется "синдром четырех бандитов" или "синдром Александреску", когда неопытный разработчик прочитал умную книгу и принял её за серебряную пулю.
Re[5]: Антипаттерн, противоположный Primitive Obsession
От: T4r4sB Россия  
Дата: 18.03.23 18:03
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Не знаю, что там Волшин, а в нормальных языках и библиотеках оператор + просто определяется для (position, offset)->position и (offset, offset)->offset.


Ну ок, у тебя есть position, который [0..8) и offset который [-7..7]. Если ты применишь оператор (position, offset)->position к паре (5,5), то у тебя будет паника и прога упадёт.
Re[6]: Антипаттерн, противоположный Primitive Obsession
От: vaa  
Дата: 19.03.23 03:42
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, Sinclair, Вы писали:


S>>Не знаю, что там Волшин, а в нормальных языках и библиотеках оператор + просто определяется для (position, offset)->position и (offset, offset)->offset.


TB>Ну ок, у тебя есть position, который [0..8) и offset который [-7..7]. Если ты применишь оператор (position, offset)->position к паре (5,5), то у тебя будет паника и прога упадёт.


 (position, offset)-> Option<position>
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Антипаттерн, противоположный Primitive Obsession
От: vsb Казахстан  
Дата: 19.03.23 03:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

TB>>А как этот долбаный фанатик собирается писать банальную задачу "прибавить к позиции шахматной фигуры смещение и проверить валидность результата"? Ведь согласно его идеям позиция шахматной фигуры должна иметь тип [0..8), а смещение должно иметь тип [-7 ..7], и складывать их нельзя, и любая попытка скастить одно к другому вызовет исключение в некоторых случаях.

TB>>То есть он предлагает что-то типа

TB>>
TB>>try_cast_or_throw<Position>((position as int) + (offset as int))
TB>>

TB>>?
S>Не знаю, что там Волшин, а в нормальных языках и библиотеках оператор + просто определяется для (position, offset)->position и (offset, offset)->offset.
S>Зачем городить преобразования туда-обратно мне решительно непонятно. Задача отличается от алгебры поверх DateTime / TimeSpan исключительно дополнительными ограничениями на диапазон валидных значений.

И как предлагается этим пользоваться? На каждый чих писать отдельный тип с кучей операторов? Ещё тип для смещений этого типа. Не очень понятно. Звучит как маразм или я что-то не понимаю.
Re[6]: Антипаттерн, противоположный Primitive Obsession
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.03.23 05:04
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:
TB>Ну ок, у тебя есть position, который [0..8) и offset который [-7..7]. Если ты применишь оператор (position, offset)->position к паре (5,5), то у тебя будет паника и прога упадёт.
Ну почему же упадёт? Надо просто ловить соответствующее исключение. Типичный пример checked arithmetics.
Опять же, в приличных языках есть возможности отдельно описать поведение операторов с включенными проверками и без них, и дать пользователю выбор.
Тогда
var a = (position)5 + (offset)5 - (offset)3;

даст a == (position)8, а
checked
{
  var a = (position)5 + (offset)5 - (offset)3;
}

— выбросит исключение.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Антипаттерн, противоположный Primitive Obsession
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.03.23 05:07
Оценка:
Здравствуйте, vsb, Вы писали:
vsb>И как предлагается этим пользоваться? На каждый чих писать отдельный тип с кучей операторов? Ещё тип для смещений этого типа. Не очень понятно. Звучит как маразм или я что-то не понимаю.
На каждый чих — нет, не надо. А насколько часто у вас встречаются диапазонные типы? Ну, так, если по-честному?

Если нас интересует не диапазон, а размерность, то есть вполне себе простой способ описывать типы обобщённым образом, по некоторому шаблону.
Не сложнее пишется и шаблон для пары типов "база, смещение", т.к. арифметика у них ведёт себя весьма предсказуемо.

В чём проблема-то?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.