Можно втиснуть проверку на null внутрь метода и в случае, если объект не найден, бросить Exception. Но этим мы просто переименовываем NullReferenceException в, к примеру, ItemNotFoundException.
Выброс исключения делает не с целью замены NRE на что то другое, а для лучшей диагностики ошибок. Чтобы исключение возникло именно тогда, когда у тебя уехала логика. Если ты не кинешь исключение, то NRE у тебя возникнет через пол часа в коде абсолютно не связанным с GetItem
>>Настоящее нарушение инкапсуляции это например friendly function в C++.
нет, конечно. Это не нарушение, так как класс сам решает кто ему friend, а кто не friend. А вот дот нетовская рефлексия или reinterpret_cast в с++ — это да.
>>и без сахара найдёт способ написать понятно и корректно
понятно и корректно — но только в рамках заданного языка. без синтаксического сахара.
Ну вот хоть тут будет супер-пупер программист на асме, но даже середнячок на шарпе клиента к БД напишет понятнее.
И нормальный программер на OCaml напишет какой нить парсер в 100 раз понятнее, чем это сделает сишник.
>>Честно говоря, я в LINQ и вообще C# разбираюсь как баран в апельсинах, и на мой незамыленный взгляд вы с exvel видите тут «след C#» просто потому, что пишете на нем
Точно. В шарпе то синтаксический сахар для монад есть, а в джаве насколько я вижу только лямбды осилили.
в основном догфудинг наверное, т.к. STL или Boost в этом коде замечен не был.
ну какой же это тогда догфудинг. Даешь boost::mpl/ BOOST_PP и побольше, побольше -))
Вывод — даже великие иногда ошибаются, а на Reflection.Emit можно сделать полнофункциональный компилятор. Правда, придется как следует попариться.
У System.Reflection.Emit есть один фатальный недостаток — он генерирует код только под ту версию рантайма, под которой запущен компилятор. С этим в частности столнулись разработчики упомянутого выше Nemerle. В результате нужно иметь отдельную версию компилятора под каждую версию .NET
Для встаеваемого языка это не важно, но для компиляторов «обычных» языков, типа C#/F#/VB.NET — это серьезный минус.
Каждый новый Build Agent дает 10 дополнительных конфигураций билдов.
О-па. А мы как раз купили энтерпрайз редакцию. Ну да ладно, не жалко особо. Meta-Runner позволяет вновь использовать ранее определенную последовательность шагов сборки проекта;
Вот это — супер!!! Ждали, ждали и наконец дождались. сенкс.
мешает то, что getLine/readFile/putStrLn — это НЕ упакованные функции.
контекст — это generic тип, параметризируемый типом значения. контекст значения и контекст функции — это одно и тоже, ведь функции — это тоже значения.
Just 10 — имеет тип MayBe < int >
Just (+3) имеет тип MayBe<int(int)> в плюсах (или MayBe<Func<int, int>> в шарпе)
Кста, есть у мя одна непонятка на эту тему. Вот что пишет один уважаемый человек herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/
Обрати внимание что он пишет нас счет make_unique и exception safety. По идее с shared_ptr<...>(new ..) те же проблемы, но о них саттер не упоминает. Это Саттер забыл упомянуть или все таки между make_shared и make_unique в этом моменте какие то различия есть?
12. Структуры являются неизменяемыми, когда используются в коллекциях
Дело не колеекциях, а в том, что list[0] вернет rvalue. можете поэксперементировать с обычным методом, возвращающим структуру.
>>Да потому что RAII добавит работы сборщику мусора и «сломает» существующие алгоритмы. При выходе из области видимости сборщик мусора должен запустится
Зачем запускаться сборщику мусора ?? Нужно просто выполнить деструктор и всё.
>>это — смешанная проблема внимательности разработчика и технологии в целом.
ну возможно в 80х годах — это была и смешанная проблема, но в 21 веке — это проблема отсталости технологии. Печалит, что даже в совремнных версиях дельфи я не могу нормальный FreeAndNil написать. Максимум, что можно — TObjectHelper.FreeAndNil [ TMyObject ] (MyObject) // вместо [] — угловые скобки читать
ну у нас переодически абстрактные классы стал интерфейсами становятся. компилятор ничего не говорит, но естественно при вызов FreeAndNil — AV получаем. Так что проблем с этой функцией есть
есть 2 нюанса, которые говорят о том, что все-таки не модуль является единицей инкапсуляции:
1. Приватный метод класса можно вызвать из другого модуля (например, посредством перегрузки (override) метода с другой областью видимости)
это говорит только о том, что класс не инкапсулирует свои private члены. Модуль же инкапсулирует все, что находится под implementation. Помести туда класс и никто извне модуля не сможет к нему доступ иметь.
2. Синтаксически и семантически свойства и методы инкапсулируются в класс.
а синтаксис — это не важно. Важно только то, какая сущность способна ограничить доступ к своим членам извне. для младших дельфей — это модуль.
Выброс исключения делает не с целью замены NRE на что то другое, а для лучшей диагностики ошибок. Чтобы исключение возникло именно тогда, когда у тебя уехала логика. Если ты не кинешь исключение, то NRE у тебя возникнет через пол часа в коде абсолютно не связанным с GetItem
нет, конечно. Это не нарушение, так как класс сам решает кто ему friend, а кто не friend. А вот дот нетовская рефлексия или reinterpret_cast в с++ — это да.
понятно и корректно — но только в рамках заданного языка. без синтаксического сахара.
Ну вот хоть тут будет супер-пупер программист на асме, но даже середнячок на шарпе клиента к БД напишет понятнее.
И нормальный программер на OCaml напишет какой нить парсер в 100 раз понятнее, чем это сделает сишник.
Точно. В шарпе то синтаксический сахар для монад есть, а в джаве насколько я вижу только лямбды осилили.
ну какой же это тогда догфудинг. Даешь boost::mpl/ BOOST_PP и побольше, побольше -))
У System.Reflection.Emit есть один фатальный недостаток — он генерирует код только под ту версию рантайма, под которой запущен компилятор. С этим в частности столнулись разработчики упомянутого выше Nemerle. В результате нужно иметь отдельную версию компилятора под каждую версию .NET
Для встаеваемого языка это не важно, но для компиляторов «обычных» языков, типа C#/F#/VB.NET — это серьезный минус.
О-па. А мы как раз купили энтерпрайз редакцию. Ну да ладно, не жалко особо.
Meta-Runner позволяет вновь использовать ранее определенную последовательность шагов сборки проекта;
Вот это — супер!!! Ждали, ждали и наконец дождались. сенкс.
контекст — это generic тип, параметризируемый типом значения. контекст значения и контекст функции — это одно и тоже, ведь функции — это тоже значения.
Just 10 — имеет тип MayBe < int >
Just (+3) имеет тип MayBe<int(int)> в плюсах (или MayBe<Func<int, int>> в шарпе)
Обрати внимание что он пишет нас счет make_unique и exception safety. По идее с shared_ptr<...>(new ..) те же проблемы, но о них саттер не упоминает. Это Саттер забыл упомянуть или все таки между make_shared и make_unique в этом моменте какие то различия есть?
Дело не колеекциях, а в том, что list[0] вернет rvalue. можете поэксперементировать с обычным методом, возвращающим структуру.
Зачем запускаться сборщику мусора ?? Нужно просто выполнить деструктор и всё.
ну возможно в 80х годах — это была и смешанная проблема, но в 21 веке — это проблема отсталости технологии. Печалит, что даже в совремнных версиях дельфи я не могу нормальный FreeAndNil написать. Максимум, что можно — TObjectHelper.FreeAndNil [ TMyObject ] (MyObject) // вместо [] — угловые скобки читать
В смысле «планировалось». Оно и есть, вполне себе существует… водородная бомба.
1. Приватный метод класса можно вызвать из другого модуля (например, посредством перегрузки (override) метода с другой областью видимости)
это говорит только о том, что класс не инкапсулирует свои private члены. Модуль же инкапсулирует все, что находится под implementation. Помести туда класс и никто извне модуля не сможет к нему доступ иметь.
2. Синтаксически и семантически свойства и методы инкапсулируются в класс.
а синтаксис — это не важно. Важно только то, какая сущность способна ограничить доступ к своим членам извне. для младших дельфей — это модуль.