metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-07-19 03:24 pm

Адский холивар

На тему "зачем нужен reflection и метаданные, если все можно писать вручную в коде".
Это пиздец, граждане. Я подозревал, что есть люди абстрагированные от мира реальной разработки и его проблем, но не подозревал, что настолько.

ссылко 1
ссылко 2

[livejournal.com profile] zabivator и второй персонаж оттуда усиленно убеждают, что ничего этого не нужно, а потом комментом ниже предлагают решения, которые являются ничем иным, как закатом солнца реализацией рефлекшена и метаданных вручную.

Я тут сижу, думаю, как бы это вообще всю эту метаданную жопу вынести на уровень модели и генерить из нее код, затем мержить с написанной вручную нетривиальностью и таким образом избавится от 1000-кратного писания одного и того же кода "база данных->sqlreader->поле объекта->веб-сервис->поле объекта на клиенте->элемент гуя->поле объекта->веб-сервис->поле объекта->sqlparameter->база данных". Потому что у меня за пару дней может база на 3-5 таблиц увеличится, в каждой по 10-20 полей, и это все надо выставить юзеру на редактирование, да еще красиво, с подписями на трех разных языках и чтобы работать можно было и с мыши и с клавиатуры и чтобы не тормозило, и чтобы неправильных данных при всем желании запилить нельзя было.

А народу пофег, как я посмотрю. Нужно конфиг руками читать - читают. Понадобится изменения сделать - будут дописывать case в switch или там if/else и молиться, что остальные команды разработчиков код сохранения не поломают, и что имена будут одинаковые.

Видимо, я что-то в современной софторазработке и принятой в ней эффективности работы отдельных разработчиков не понимаю.

[identity profile] adontz.livejournal.com 2009-07-19 03:49 pm (UTC)(link)
В compile time можно ловить только то, что пишешь сам.+

[identity profile] gds.livejournal.com 2009-07-19 04:25 pm (UTC)(link)
верно. Но обычно нужно обрабатывать только то, что можешь обработать сам (другое обрабатывать не нужно).

[identity profile] adontz.livejournal.com 2009-07-19 04:29 pm (UTC)(link)
Для крупного приложения, которое, зачастую, пишут вообще разные компании, это не так.

[identity profile] gds.livejournal.com 2009-07-19 04:39 pm (UTC)(link)
варианты "игнорировать значение конфига" и "передать значение конфига для дальнейшей обработки наверх" я не считал вариантом "обработать", отсюда, возможно, недопонимание. Действия "игнорировать"/"передать", конечно, должно быть (какое из них -- решать программисту). Но и тут рефлекшн не нужен.

[identity profile] adontz.livejournal.com 2009-07-19 04:44 pm (UTC)(link)
Задача рефлекшена простая - корректная работа с типами, о которых ничего не известно на этапе компиляции.
Вот вы ратуете за кодогенерацию, но данные для неё, опять таки, могут быть не известны на этапе компиляции. Нужен рефлекш чтобы эти данные получить, а нужен потом генерировать.

[identity profile] gds.livejournal.com 2009-07-19 05:17 pm (UTC)(link)
если у меня в одной программе есть тип данных "простое число" и она сохраняет значения этого типа в конфиг, а в другой программе есть возможность читать конфиг первой программы, сохраняющей некоторые простые числа в конфиг, то каким образом она, имея только конфиг (допустим, plain text или xml), 1. выведет сохранённое значение пользователю? 2. создаст новое значение этого типа? Для полноты картины можно представить, что я храню простые числа как integer, в котором запаковано представление вида 6n+-1.

Максимум, что получится, это скопировать данное значение или игнорировать его. "Получить" его для другого использования в программе -- нереально.
Всё изменится, если вместе со значением будет поставляться код для его преобразования в строку и для прочих операций, для которых не хватает битового представления. Но это уже не рефлекшн, а нечто бОльшее, требующее динамической загрузки кода, поддерживающего необходимые операции.