Может мне теперь вообще не работать потому что у меня комп слабый и не тянет такой серьезный инструмент как IDEA?
Пойду продолжу свою несерьезную работу в eclipse.
Вы точно не видели eclipse, он сам подбирает имена для переменных и сам ставит круглые скобки. Я просто видео лучше не нашел. А по поводу IDEA — после этой статьи я просто не мог не поставить себе community edition. Пробую в нем работать, пока нечего сказать, кроме того что на моем стареньком компе он однозначно тормознее eclipse.
Но в переопределенном методе потомка можно вызвать родительский метод, тем самым сохранить контракт.
Мне видится что нарушение контракта будет тогда, когда, например, базовый класс на каждый вызов метода Add вызывает метод слушателя OnAdd, это то чего мы ожидаем, т.е. его побочный эффект. Если в потомке не будет вызываться метод OnAdd слушателя — контракт нарушен.
Кстати, о «подстановочном критерии Лискова» упоминал Джеф Элджер, в книге C++. Там, где говорил о нормальном наследовании и гомоморфных иерархиях. Так вот, относительно контракта Элджер упомянул, что если функция базового класса является чисто виртуальной, то все ее вторичные эффекты (которых на самом деле нет) сохраняются по определению. А так как речь идет об интерфейсах, раз они не задают поведения, то и никакого контракта по сути нет. В этом действительно есть здравый смысл.
Я в IDEA не работал, но Eclipse тоже неплохо понимает контекст, сам типы в шаблонах подставляет а как его конструкция toarray работает — вообще чудеса какие-то!
К сожалению только это видео нашел, но и тут видно что Eclipse половину работы за программиста делает: archive.eclipse.org/technology/phoenix/europa/TestFirstWithEclipse/
Очень даже бывает, не всегда при проектировании используется декомпозиция, бывает еще и обобщение используют ;)
Я имел в виду что imp это указатель на базовый класс, через его интерфейс происходит работа с объектом.
Да, «Мост» использует интерфейсы/базовые классы, это видно из его UML-диаграммы. Знаете, интерфейсы можно использовать по-разному, конкретно «Мост» использует их для инкапсуляции части реализации, да, технически тут нет ничего хитрого, обычное использование интерфейсов.
А по вашей логике тогда и «Абстрактная фабрика»=«Использование интерфейсов».
Мне кажется в пункте 2 дополнительных пояснений вы указали как раз «Мост». Тонкой нитью через все паттерны проходит идея инкапсулировать изменяющиеся части программы. Данный паттерн предлагается использовать когда изменениям подвержена какая-то часть реализации класса.
Бывает, что иерархия того на что указывает imp поставляется с библиотекой, которую нет возможности модифицировать. К тому же введение нового метода в базовый класс/интерфейс ухудшит его инкапсуляцию.
Ну и лично я не тут вижу «зависти» по Фаулеру, обычный вызов методов через интерфейс базового класса, разве их как-то по другому нужно использовать?
Дайте я попробую вспомнить как это было…
В таких случаях используется математика с числами с фиксированной запятой. Смотрите, наша задача разделить ticks на 32,768. ticks — целое число, зафиксируем его запятую у младшего бита[0000 0000,]. Масштаб этого числа M=0. Теперь нужно выбрать масштаб для числа 32,768, более-менее точно это число можно представить с 2 знаками после запятой: 2^5 + 2^-1 + 2^-2 = [1000 00,11] = 32,75, таким образом масштаб этого числа M=2 (пусть меня поправят, возможно это масштаб -2). В двоичном виде число получится 0x83 (десятичное 131).
Таким образом перевод ticks в мс сводится к делению ticks/0x83 и выравниванию масштаба результата. Результат получается с масштабом M=-2, для получения масштаба 0 — умножим на 4 (по сути сдвигаем результат на 2 разряда влево).
Пример: ticks = 32768, ticks/131=250, 250*4=1000
Само число 32,768 можно представить и с большей точностью — захватить побольше знаков после запятой, соответственно число будет в другом масштабе.
Все верно, одиночке тут самое место, к тому же, если вдруг в будущем понадобится несколько экземпляров AppSettings, переделать одиночку будет гораздо проще чем статический класс.
Вот интересная на эту тему книга (http://zamyatkin-nikolay.narod.ru)
Это не учебник, там заблуждения и прочие интересные факты об изучении иностранных языков.
Пойду продолжу свою несерьезную работу в eclipse.
Мне видится что нарушение контракта будет тогда, когда, например, базовый класс на каждый вызов метода Add вызывает метод слушателя OnAdd, это то чего мы ожидаем, т.е. его побочный эффект. Если в потомке не будет вызываться метод OnAdd слушателя — контракт нарушен.
К сожалению только это видео нашел, но и тут видно что Eclipse половину работы за программиста делает:
archive.eclipse.org/technology/phoenix/europa/TestFirstWithEclipse/
Я имел в виду что imp это указатель на базовый класс, через его интерфейс происходит работа с объектом.
А по вашей логике тогда и «Абстрактная фабрика»=«Использование интерфейсов».
Ну и лично я не тут вижу «зависти» по Фаулеру, обычный вызов методов через интерфейс базового класса, разве их как-то по другому нужно использовать?
Зачастую это приходится делать даже когда исходник на руках, спасибо «низкому порогу входа».
В таких случаях используется математика с числами с фиксированной запятой. Смотрите, наша задача разделить ticks на 32,768. ticks — целое число, зафиксируем его запятую у младшего бита[0000 0000,]. Масштаб этого числа M=0. Теперь нужно выбрать масштаб для числа 32,768, более-менее точно это число можно представить с 2 знаками после запятой: 2^5 + 2^-1 + 2^-2 = [1000 00,11] = 32,75, таким образом масштаб этого числа M=2 (пусть меня поправят, возможно это масштаб -2). В двоичном виде число получится 0x83 (десятичное 131).
Таким образом перевод ticks в мс сводится к делению ticks/0x83 и выравниванию масштаба результата. Результат получается с масштабом M=-2, для получения масштаба 0 — умножим на 4 (по сути сдвигаем результат на 2 разряда влево).
Пример: ticks = 32768, ticks/131=250, 250*4=1000
Само число 32,768 можно представить и с большей точностью — захватить побольше знаков после запятой, соответственно число будет в другом масштабе.
(http://www.youtube.com/watch?v=vCSvNyHorgo&feature=relmfu)
Это не учебник, там заблуждения и прочие интересные факты об изучении иностранных языков.