А зачем? Зачем нам getData от несуществующих данных? Зачем getName от несуществующих данных? Как отличить ситуацию, когда «имя» = "" и ситуацию, когда оно не найдено? Получается, что мы заменяем невалидный явно объект NULL на объект невалидный неявно — объект-пустышку, только для того, чтобы вызвать код, который по определению не может с пустышкой работать. Это еще не говоря про то, что где-то this может быть пустым и это сработает и так.
Смотрите (давайте в обратном порядке, так немного очевиднее).
Я иду в удаленную БД: person = getPerson(id)
Она вернула мне ссылку на объект на ее стороне (потому что ничего другого она сделать не может)
В person именно эта ссылка
Не совсем так, но даже в этом случае мы можем создать наш объект на пункте 0 и попросить его скопировать значение (состояние) объекта по ссылке person.
Я думал примерно о:
1. Создаем объект-ответ: textual_response = new TextualResponse;
2. Делаем запрос, передавая ссылку на наш объект: getPerson(id, textual_response)
3. База заполняет ответ на своей стороне: remote_host.textual_response.setvalue(...)
И далее. Технически будет обмен примитивами все равно — БД должна запихнуть строчку в наш textual_response объект, но это может быть что-то типа friend полей/методов, которые доступны только внутри объектов или при помощи 3й сущности-объекта, которая может работать с внутренним представлением и копировать состояние объектов.
… а еще я внезапно понял, что для этой системы невозможно реализовать равенство по значению. Или я что-то путаю?
Тут через 3й объект-супервизор см. выше.
Это длинная и нафиг ненужная цепочка, просто абстракция ради абстракции. Но раз уж мы говорим о том, что это-де технически невозможно, то все же можно придумать такую систему. Просто в качестве разминки ума, на деле кому это надо.
Нет, ссылку на интерфейс объекта-результата на нашей стороне мы отправили сервису. Он воспользовался (посредством ссылки) объектом-результатом, который у нас находится.
Ну очевидно, что раз мы запросили сервис, то и результат получим мы, а не база. А уж в базу кинем мы.
Если вы хотите DMA-alike поведение, то да, придется им друг друга увидеть.
new If(new NotEqual(b, new NumericalObjectZero()), new Divide(a, b), b)
Какие еще «0»? Автор же говорит — никаких NULL, используйте Null Object design, а с какой стати 0 тогда должен быть? 0 — это специальный случай — ведь на него делить нельзя. Следовательно, мы не можем использовать null 0, мы должны использовать специальный NumericalObjectZero.
которые перестанут тянуть идею «всё есть объект» куда не надо…
Действительно. ООП — это лишь метод, способ работы с данными. Есть ситуации, где это оправдано, есть, где нет. Где нет внутреннего состояния, где слои абстракции только скрывают суть действия ничем не помогая.
Нет, ну возможен компромисс. У нас в коде тоже иногда приходится сокращать для повышения читаемости. Обычно эти сокращения расшифровываются в месте объявления в комментарии. Просто когда идентификатор такой длины, что невозможно написать в одну строку что-то вида a.push(b.pop), когда a и b длиной в пол-экрана — это тоже плохо.
Потому что альтернатива —
Доступность предполагается. Необязательно всех, достаточно двух попарно обменивающихся частей системы, их специфических для данного вида обмена интерфейсов.
Но ссылка да — будет примитивом. С другой стороны, это будет единственный примитив. Не то что бы мне это было интересно, просто к слову пришлось по ходу чтения вашей дискуссии.
ссылку на объект «пользователь», по которой и реестр, и обработчик смогут послать любое сообщение, и получить ответ. Но вот незадача… ответ на сообщение getFullName — это что? Объект? Тогда мы попали в замкнутый круг. Или это значение-строка? Но тогда мы нарушили униформность.
Допустим, DCOM alike принцип. Если мы хотим униформности, то мы у себя генерируем объект вида «ответ» и пересылаем ссылку на него с запросом. Часть, ответственная за пользователя, генерирует полное имя и обращаясь к нашему объекту-ответу, устанавливает его внутреннее содержание.
И все равно, блин, «ссылка» будет примитивом.
Но при этом такая же ситуация у себя в коде людей не бесит :-)
Это некорректный аргумент: код моноширинный и форматирование пробелами не едет при добавлении/удалении отступа.
Если среда разработки не понимает смарт-табуляцию и не может автоматически понять, где вставить табуляцию, а где пробел, то грош ей цена, такой среде.
Смысл, если можно везде использовать пробел, без переключений? И для отступа, и для выравнивания? Вы предлагаете более сложную систему, которая функционально полностью эквивалентна «пробельной» — зачем?
«тут внутри строки я нажимал Tab среда сама поставила пробелы — в чем разница с ситуацией, когда пробелы будут везде?
Все остальные аргументы теряют свою важность перед смыслом
Исходный смысл табуляции — разметка таблиц при печати, он утерян уже очень давно.
которые приходится удалять по одному, ходить по ним курсором, а если копипастишь и зацепил выделением лишний пробел
Да нет, все от IDE зависит. У меня клавиши «влево»-«вправо» по отступам переходят, при том, что они — пробелы. Удаляется все опять же комбинацией клавиш «убрать отступ», встроенной в IDE. При копировании, выделении, сразу целиком отступ копируется.
Это можно улучшить, вводя вспомогательные структуры и вопрос будет решаться уже не по ассимптотике, а по константам (статья как раз об этом). Хотя и по ассимптотике — если взять тот же массив указателей на блоки, его придется двигать только при создании блока, а поиск будет логарифмический.
А зачем? Зачем нам getData от несуществующих данных? Зачем getName от несуществующих данных? Как отличить ситуацию, когда «имя» = "" и ситуацию, когда оно не найдено? Получается, что мы заменяем невалидный явно объект NULL на объект невалидный неявно — объект-пустышку, только для того, чтобы вызвать код, который по определению не может с пустышкой работать. Это еще не говоря про то, что где-то this может быть пустым и это сработает и так.
Не совсем так, но даже в этом случае мы можем создать наш объект на пункте 0 и попросить его скопировать значение (состояние) объекта по ссылке person.
Я думал примерно о:
1. Создаем объект-ответ: textual_response = new TextualResponse;
2. Делаем запрос, передавая ссылку на наш объект: getPerson(id, textual_response)
3. База заполняет ответ на своей стороне: remote_host.textual_response.setvalue(...)
И далее. Технически будет обмен примитивами все равно — БД должна запихнуть строчку в наш textual_response объект, но это может быть что-то типа friend полей/методов, которые доступны только внутри объектов или при помощи 3й сущности-объекта, которая может работать с внутренним представлением и копировать состояние объектов.
Тут через 3й объект-супервизор см. выше.
Это длинная и нафиг ненужная цепочка, просто абстракция ради абстракции. Но раз уж мы говорим о том, что это-де технически невозможно, то все же можно придумать такую систему. Просто в качестве разминки ума, на деле кому это надо.
Если вы хотите DMA-alike поведение, то да, придется им друг друга увидеть.
Какие еще «0»? Автор же говорит — никаких NULL, используйте Null Object design, а с какой стати 0 тогда должен быть? 0 — это специальный случай — ведь на него делить нельзя. Следовательно, мы не можем использовать
null0, мы должны использовать специальный NumericalObjectZero.Действительно. ООП — это лишь метод, способ работы с данными. Есть ситуации, где это оправдано, есть, где нет. Где нет внутреннего состояния, где слои абстракции только скрывают суть действия ничем не помогая.
http://www.multitran.ru/c/m.exe?CL=1&s=take&l1=1
Потому что альтернатива —
А это ужас.
Но ссылка да — будет примитивом. С другой стороны, это будет единственный примитив. Не то что бы мне это было интересно, просто к слову пришлось по ходу чтения вашей дискуссии.
Допустим, DCOM alike принцип. Если мы хотим униформности, то мы у себя генерируем объект вида «ответ» и пересылаем ссылку на него с запросом. Часть, ответственная за пользователя, генерирует полное имя и обращаясь к нашему объекту-ответу, устанавливает его внутреннее содержание.
И все равно, блин, «ссылка» будет примитивом.
Это некорректный аргумент: код моноширинный и форматирование пробелами не едет при добавлении/удалении отступа.
Смысл, если можно везде использовать пробел, без переключений? И для отступа, и для выравнивания? Вы предлагаете более сложную систему, которая функционально полностью эквивалентна «пробельной» — зачем?
«тут внутри строки я нажимал Tab среда сама поставила пробелы — в чем разница с ситуацией, когда пробелы будут везде?
Исходный смысл табуляции — разметка таблиц при печати, он утерян уже очень давно.
Да нет, все от IDE зависит. У меня клавиши «влево»-«вправо» по отступам переходят, при том, что они — пробелы. Удаляется все опять же комбинацией клавиш «убрать отступ», встроенной в IDE. При копировании, выделении, сразу целиком отступ копируется.