понедельник, мая 07, 2012


Вольный перевод фрагмента книги Брюса Эккеля «Thinking in Java.»
  1. Изящество всегда вознаграждается. Может показаться, что слишком долго искать действительно красивое решение проблемы, но когда вы сможете легко адапатировать его к новой ситуации, избежав долгих часов, дней, а то и месяцев борьбы с собственным кодом, вы будете вознаграждены(даже если со стороны это будет незаметно). Это позволит вам создать программу, которую легко не только скомпилировать и отладить, но и понимать и изменять, что, собственно, и составляет коммерческую ценность. Понимание этого пункта требует некоторого опыта, поскольку, пока вы делаете фрагмент кода элегантным, кажется, что вы мало продуктивны. Не поддавайтесь спешке и суете, они только замедлят вашу работу.
  2. Сначала заставь работать, потом ускоряй. Это верно, даже если вы уверены, что фрагмент кода действительно важен и будет основным узким местом в вашей системе. Не торопитесь. Сперва заставьте систему работать с настолько простым решением задачи, насколько это возможно. Уже потом, если решение оказалось не достаточно быстрым, профилируйте его. Почти всегда вы обнаружите, что ваше мнимое узкое место не проблема. Потратьте время на более важные вещи.
  3. Помните принцип «Разделяй и властвуй». Если проблема, которой вы занимаетесь, слишком сложна, попробуйте вообразить, как должна работать программа, если некий черный ящик скроет все сложности. Этот черный ящик — объект. Напишите сначала код, который использует объект, а потом рассмотрите проблемый объект еще раз и инкапсулируйте его сложности в другие объекты.
  4. Отделите создателя класса, от его пользователя(программиста-клиента). Пользователь класса — это своего рода «покупатель», и ему не интересно, что происходит внутри класса. Создатель класса должен быть экспертом в своем деле и создавать код так, чтобы даже использование его начинающим программистом, было работоспособным и эффективным. Библиотеку использовать легко, только если способ ее использования прозрачен.
  5. Когда создаете класс, постарайтесь использовать такие имена, чтобы комментарии не понадобились. Ваша цель сделать программный интерфейс модуля концептуально простым. Для этого используйте, по возможности, перегрузку методов.
  6. Анализ и дизайн должны определить, как минимум, классы вашей системы, их открытые интерфейсы и их отношения с другими классами, в особенности — базовыми. Если ваш способ разработки производит более того, спросите себя, все ли произведенное имеет значение на протяжении жизненного цикла программы. Если нет, поддержка лишнего влетит вам в копеечку. Участники групп разработки стараются не поддерживать ничего, что не способствует их продуктивности. Фактически, многие методологии разработки этого не учитывают.
  7. Автоматизируйте все. Пишите тестовый код первым(до написания самого класса) и храните его вместе с классом. Автоматизируйте прогон тестов вместе со сборкой. Возможно, вы выберете для этого Ant — стандарт дефакто для сборки Java программ. Таким образом, все изменения будут автоматически проверены прогоном тестового кода и вы немедленно обнаружите ошибки. Благодаря сети безопасности вашей тестовой оболочки, вы будете более уверенно вносить изменения, когда обнаружится такая необходимость. Помните, что величайшие улучшения в языках произошли именно из встроенных тестов, предоставляемых контролем типов, системой исключений и пр., но только до сих пор. Остальной путь вы должны проделать сами, создавая надежную систему исполняющую тесты, которые проверят основные специфические свойства вашего класса или программы.
  8. Пишите тестовый код первым(прежде чем написать класс) для того, чтобы проверить, что разработка класса завершена. Если вы не способны написать тестовый код, вы не знаете, на что похож ваш класс. Вдобавок, написание тестового кода часто позволяет выявить все дополнительные свойства и ограничения, которые вы могли бы заложить в класс. Эти свойства и ограничения не всегда появляются на стадии анализа и разработки. Кроме того, тесты представляют собой пример кода, показывающий, как следует использовать ваш класс.
  9. Все проблемы разработки ПО могут быть упрощены добавлением дополнительного уровня концептуального обобщения. Это фундаментальное правило разработки ПО является основой абстракции, наиважнейшей особенности объектно-ориентированного программирования.
  10. Обобщение должно иметь значение. Это значение может быть столь простым как «совмещение часто используемого кода в одном методе». Если вы добавляете уровни обобщения (абстракции, инкапсуляции и пр.), которые не имеют значения, это столь же плохо, как не иметь их вообще.
  11. Делайте классы настолько атомарными, насколько это возможно. Давайте каждому классу единственное, четкое предназначение. Если ваши классы или вся система становятся слишком сложными, разбейте сложные классы на более простые. Самый простой индикатор — размер, если класс слишком большой, есть вероятность, что он делает слишком много и должен быть декомпозирован. Ключом к переработке класса может быть:
    • Сложный switch(оператор выбора): попробуйте использовать полиморфизм.
    • Большое количество методов, охватывающих очень разные типы операций: следует использовать несколько классов.
    • Большое количество переменных-членов класса, которые определяют очень разные параметры: следует использовать несколько классов.
  12. Следите за длинными списками параметров. Вызов метода становится труднее читать, записывать и поддерживать при росте списка параметров. Вместо этого, попробуйте разместить метод в соответствующем классе и/или передавать параметры в виде объектов.
  13. Не повторяйтесь. Если фрагмент кода повторяется во многих методах производных классов, поместите этот код в один метод базового класса и вызывайте этот метод из методов производных классов.
  14. Следите за операторами switch или цепочками ветвлений if-else. Это типичный индикатор проверки типа — вы пытаетесь выбрать, какой код исполнять в зависимости от того, каков тип данных (в точности тип может быть и неизвестен поначалу). Обычно подобный код можно заменить наследованием и полиморфизмом. Полиморфный метод производит проверку типа вместо вас и обладает лучшей расширяемостью.
  15. С точки зрения дизайна, осмотрите и отделите вещи, которые меняются, от вещей, которые остаются неизменными. То есть отыщите элементы системы, которые вы можете захотеть изменить без редизайна, затем инкапсулируйте такие элементы в классах. Сведения о шаблонах проектирования, вы можете почерпнуть в книге «Thinking in Patterns with Java», доступной для скачивания на сайте автора
  16. Не расширяйте базовую функциональность с помощью подклассов. Если элемент интерфейса важен для класса, он должен находиться в базовом классе, а не добавляться при наследовании. Если вы добавляете методы в производных классах, возможно, стоит переосмыслить весь дизайн.
  17. Меньшее — это большее.Начните с минимального интерфейса класса, настолько маленького и простого, насколько вообще позволяет решение текущей задачи. Не пытайтесь предвидеть все способы, которыми ваш класс может быть использован. Напротив, используя класс, вы обнаружите, как еще стоит расширить интерфейс. Однако, если класс уже используется, невозможно расширить интерфейс без изменения клиентского кода. Если нужно добавить новые методы — клиентский код не изменится. Но если новые методы заменят функциональность старых, лучше оставить старый интерфейс (вы можете объединить функциональность в последующей реализации, если захотите). Если нужно расширить интерфейс существующего метода добавлением новых аргументов, создайте перегруженный метод с новыми аргументами. Такой способ никак не помешает существующим вызовам того метода.
  18. Прочтите ваши классы вслух, чтобы убедиться, что они логичны. Отношение между производным и базовым классом произносите как «есть», а между классом и объектами-членами как «имеет, содержит».
  19. Когда выбираете между наследованием и композицией, спросите себя требуется ли приведение к базовому типу. Если нет, выбирайте композицию(объекты-члены). Это устранит необходимость в существовании множества базовых типов. Если выберете наследование, пользователи будут думать, что предполагается приведение к базовому типу.
  20. Используйте члены класса для изменения значения и перекрытие методов для изменения поведения. То есть, если вы нашли класс, который использует переменные состояния вместе с методами, которые изменяют поведение на основе значения этих переменных, возможно, следует переработать его, отразив различия в поведении в подклассах и перекрытых методах.
  21. Следите за перегрузкой. Метод не должен исполнять код условно в зависимости от типа значения аргумента. В этом случае следует создать два или более перегруженных метода взамен.
  22. Используйте иерархии исключений, предпочитетльно, производных от специфичных классов исключений в стандартной иерархии Java. Тогда ваши специфичные исключения можно будет поймать, как исключения базового типа. Если вы добавляете новые производные исключения, существующий клиентский код будет по прежнему ловить исключения через базовый тип.
  23. Иногда помогает простая агрегация. Система комфорта пассажиров на авиалиниях состоит из разрозненных элементов: сидения, кондиционера, видео и т.п., и таких комплектов в самолете много. Вы создали частные(private) члены класса и построили полностью новый интерфейс? Не в этом случае. Компоненты так же являются частью открытого интерфейса, так что необходимо создавать открытые(public) члены класса. Такие объекты имеют собственные частные реализации, которыые по прежнему безопасны. Простую агрегацию не следует применять часто, но иногда без нее не обойтись.
  24. Смотрите с точки зрения программиста-клиента и человека, поддерживающего код. Делайте свои классы столь понятными, насколько это возможно. Предугадывайте изменения, которые могут быть внесены и разрабатывайте класс так, чтобы вносить изменения было легко.
  25. Остерегайтесь «синдрома гигантских объектов». Это частый недуг процедурных программистов, которым вновинку ООП и которые создают процедурную программу, и запирают ее в один-два гигантских объекта. За исключением каркаса приложения, объекты представляют концепцию заложенную в ваше приложение, а не его элементы.
  26. Если надо сделать что-нибудь безобразное, покрайней мере локализуйте безобразие внутри класса.
  27. Если надо сделать что-нибудь непереносимое, создайте абстракцию для этой задачи и локализуйте ее в классе. Этот дополнительный уровень абстракции предотвратит распространение непереносимости по программе. Эта идиома заложена в шаблон проектирования «Мост»
  28. Объекты не должны просто хранить данные. Они должны иметь также четко определенное поведение. Кстати, «объекты данных» — это правильное решение, но только когда используется для упаковки и транспортировки группы элементов в случае, если их обобщенный контейнер неадекватен задаче.
  29. Сперва попробуйте композицию, прежде чем создать новые классы из существующих. Наследование следует использовать только, если это необходимо. Если вы используете наследование там, где могла бы работать композиция, ваш дизайн становится неоправданно сложным.
  30. Используйте наследование и перекрытие методов для выражения разницы в поведении и поля для выражения различий состояний.Предельный пример того, чего не следует делать — это наследование различных классов для определения цветов вместо использования поля «цвет».
  31. Избегайте несогласованности. Два семантически разных объекта могут иметь идентичные действия, или задачи и естественно будет искушение попытаться сделать одно подклассом другого, просто чтобы воспользоваться наследованием. Это называется несогласованностью, но нет никакого оправдания созданию связки суперкласс-подкласс там, где она не существует. Лучшим решением будет создать общий базовый класс, который предоставит интерфейс для обоих производных классов. Это займет чуть больше места, но наследование будет полезным и возможно позволит обнаружить нечто важное в дизайне.
  32. Избегайте ограничений при наследовании. Наиболее ясные решения добавляют новые возможности к унаследованным. Подозрительно решение, убирающее прежние возможности при наследовании без добавления новых. Но правило может быть и нарушено, и если вы работаете со старой библиотекой классов, может оказаться более эффективным ограничить существующий класс в подклассе, чем реструктурировать иерархию так, чтобы новый класс разместился как следует.
  33. Используйте шаблоны проектирования для уничтожения «голой функциональности». То есть, если только один объект вашего класса должен быть создан, вставляйте код в приложение с комментарием «сделать только раз». Оберните его в шаблон «Одиночку». Если у вас много беспорядочного кода, который создает ваши объекты, в главной программе, поищите созидательный шаблон, вроде «фабричного метода», в который вы сможете инкапсулировать создание объектов. Устранение «голой функциональности» не только сделает код гораздо более понятным и поддерживаемым, кроме того оно защитит его от «благих намерений» тех, ктоо будет заниматься его поддержкой после вас.
  34. Остерегайтесь «аналитического паралича». Помните, что нужно постоянно двигаться вперед в разработке, до тех пор, пока не станете знать о проекте все, и зачастую лучший и самый быстрый способ узнать что-нибудь о неучтенных факторах — это перейти на следующий этап, вместо того, чтобы пытаться сформулировать все мысленно. Вы не можете знать решения, пока не найдете его. В Java есть встроенные файрволлы, позвольте им работать на вас. Ваши ошибки в классе или множестве классов не разрушат целостности всей системы.
  35. Когда вам кажется, что у вас все проанализировано, разработано или реализовано, проведите сквозной контроль. Позовите кого-нибудь извне вашей группы — это не должен быть консультант, а например, кто-нибудь из другой группы в вашей компании. Осмотр вашей работы свежей парой глаз может обнаружить проблемы на стадии, когда их легче устранить, и пользы от этого будет больше, чем затрат времени и средств.
От Asis.ru: Несмотря на то, что эти принципы описаны автором в книге, посвященной языку Java, в большинстве своем, они являются принципами объектно-ориентированного проектирования вообще. Если вы пишете на C++ или, тем более, С# — вышеупомянутые советы адресованы и вам.

воскресенье, января 01, 2012

Новый год без капли спиртного!

Будущее: Новый год без капли спиртного - кошмар или счастье?: Новый год без капли спиртного - для большинства жителей постсоветского пространства это кошмарный сон, а для нас, свободных во Христе - великая радость...

суббота, декабря 24, 2011


Юсеф Надархани с семьей. Фото с pravoslavie.ru


Пастор Юсеф Надархани находится в тюрьме Лакан около города Рашт, Иран, с октября 2009 года. История Надархани напоминает ночной кошмар. После ареста Юсефа его жена, Фатима, тоже была арестована, обвинена в отступничестве, и приговорена к пожизненному заключению. Власти пригрозили поместить их сыновей в другую семью, но Фатима была освобождена через 4 месяца. Тем временем, Юсефа часто помещали в одиночную камеру, охранники давали ему таблетки, чтобы заставить его отречься от христианства.

В сентябре 2010 года ему объявили смертный приговор на словах, а через два месяца он был представлен в письменном виде. Ему сказали, что его повесят, если он не отречется от своей веры. С помощью международных христианских организаций Юсеф подал апелляцию в Верховный суд Ирана. В июне этого года суд поддержал смертный приговор.

Адвокат рассказал служению Present Truth, что храбрый пастор переносит свои трудные обстоятельства с духовной стойкостью. «Физически он выглядит слабым, - сказал юрист, - но эмоционально его вера в Христа поддерживает его дух».

Президент Обама, Госсекретарь Хилари Клинтон и лидеры других правительств потребовали, чтобы Иран освободил пастора Юсефа.

«Я прошу вас сделать кое-что: пожалуйста, помолитесь за пастора Юсефа и его семью на Рождество. Когда вы празднуете свободу, которую принес нам Христос, пожалуйста, несите бремена вашего брата и просите Божьего присутствия, силы, утешения и милости – не только для Юсефа, но и многих других иранских верующих, которые страдают. Часы идут, и жизнь этого человека висит на ниточке, - говорит Джейсон Де Марс из Present Truth. - Нет гарантии, что Юсеф не будет казнен. Это может случиться в любой момент».

«Мы считаем Рождество прекрасным праздником, полным сладостей, теплых семейных воспоминаний. И все же первое Рождество не было ни теплым, ни дружелюбным. Оно было полно опасности, особенно после того, как царь Ирод начал свою кампанию с целью убить Иисуса.

Тот же дух, который владел Иродом (и его сыном Иродом Антипой, когда он обезглавил Иоанна Крестителя), действует сегодня в мире, чтобы ложно обвинять, бросать в тюрьмы и убивать христиан. По этой причине более 450 христиан в мире каждый день подвергаются пыткам. Библия говорит нам: «Помните узников, как бы и вы с ними были в узах, и страждущих, как и сами находитесь в теле» (Евр.13:3). Давайте проявим солидарность с нашим братом».

пятница, октября 21, 2011

Эгоизм - признак неполноценности


ФОТО: Samantha Steele
У тех, кто влюблен в себя, на самом деле низкая самооценка. К такому выводу пришли исследователи из Университета Западной Каролины, занимающиеся изучением феномена нарциссизма. Ученые сообщили, что глубоко в душе у нарциссов таится чувство собственной неполноценности, которое они прикрывают превознесением своих достоинств. Следовательно, такие люди искусственно завышают свою самооценку, хотя сами не верят в то, что они такие уж прекрасные.
В психологии термин "нарциссизм" впервые вел Фрейд для описания особого расстройства личности, которое заключается в чрезмерной самовлюбленности, тщеславии, повешенном самомнении и эгоизме. Этот термин происходит из древнегреческого мифа о молодом человеке по имени Нарцисс, который отверг любовь нимфы и за это был наказан Афродитой. Он влюбился в собственное отражение в воде озера и умер от голода и страданий, поскольку не смог покинуть его.
Психолог Эрин Майерс из Университета Западной Каролины решила проверить, является ли болезненная самовлюбленность изначально заложенной чертой характера, или это лишь маска, которую человек надевает. Для этого она совместно со своими коллегами провела интересный эксперимент. Студенток старших курсов университета Миссисипи в Хаттисбурге попросили сперва заполнить анкеты, которые оценят их уровень самооценки и нарциссизма. Потом психолог отвела их в лабораторию, где сообщила, что собирается провести тест на детекторе лжи.
"Я играла роль полиграфолога, носила белый халат. Мы подключили студенток к аппарату, чтоб все выглядело серьезно. Некоторым из них мы говорили, что аппарат выключен и мы просто тренируемся, а другим мы сказали, что он включен и их проверяют на ложь. На самом деле он не работал", - рассказала она. Вопросы задавались в духе "Я хорошо отношусь к себе", предполагая ответ "да/нет". Всего в эксперименте приняла участие 71 девушка.
Результаты вышли интересные. Студентки с низким уровнем проявления нарциссизма, когда думали, что по-настоящему проходят обследование на детекторе лжи, то все равно заявляли тот же уровень самооценки, что и в тесте. А вот склонные к нарциссизму девушки показали разные результаты. В случае, когда они знали, что аппарат отключен, то больше говорили о любви к себе, чем в тесте. А когда они считали, что их проверяют, то их ответы показывали низкий уровень самооценки.
"Возможно, самовлюбленные люди пытаются поддерживать высокое самомнение, хотя на самом деле страдают от чувства неполноценности. Делают они это для себя или чтобы соответствовать ожиданиям окружающих, мы пока не выяснили", - объяснила Майерс, чье исследование будет опубликовано в очередном номере научного журнала Journal of Research in Personality.

среда, сентября 21, 2011

Путин, борьба за власть в Кремле и состояние в 40 миллиардов долларов

Критики Путина заявляют, что он создал новую, более упорядоченную олигархию Газета Guardian узнала о той беспрецедентной борьбе, которая происходит внутри кремлевских стен накануне ухода Владимира Путина с поста президента и сопровождается утверждениями о том, что президент... Далее

четверг, марта 31, 2011

Developing in FireFox - must have addons

Firebug,
FirePHP,
FireRainbow,
FireQuery,
AMF Explorer,
Firecookie,
YSlow,
Drupal For Firebug.

With this addons developing process is MUCH more comfortable!
You can download and track updates of this addons here:
FireBug &Co