Объектно-ориентированные анти-паттерны

воскресенье, 10 мая 2009 г. · 0 коммент.

  • Тощая объектная модель (Anemic domain model). Использование доменной модели, которой нет бизнес логики, что не является объектно-ориетированным программированием, т.к. объект должен содержать и аттрибуты и поведеление
  • Главное зерно (Base bean). Наследование функциональности от утилитного класса вместо делигирования этой функциональности этому классу (утилитному).
  • Вызов базового метода (Call super). Необходимость вызова переопределенного метода родительского класса дочерними классами.
  • Круговая-элипсная проблема (Circle-ellipse problem). Создание ссылочных подтипов на основе подтипов значений.
  • Круговая зависимость (Circular dependency). Введение ненужных непосредственных и опосредованных взаимных зависимостей между объектами или программными модулями
  • Константные интерфейсы (Constant Interface). Использование интерфейсов для опреления констант
  • Божетсвенный объект (God object). Сосредоточение слишком многих функций в одной части системы (класса)
  • Выгребная яма (Cesspool object). Повторное использование объектов, которые не подразумевают повторное использование
  • Оргия объектов (Object orgy). Недостаточное сокрытие внутреннего устройста объекта и предоставление неограниченного доступа к его внутреннему состоянию.
  • Полтергейств (Poltergeists). Объекты, единственным назначением которых является передача информации другому объекту.
  • Последовательное сцепление (Sequential Coupling). Класс требует, чтобы его методы были вызваны в определенном порядке
  • Yo-yo проблема (Yo-yo problem). Структура, которую сложно понять, в силу чрезмерной фрагментации.

Анти-паттерны проектирования программного обеспечения

· 0 коммент.

  • Инвертирование абстракции (Abstraction inversion). Непредоставление требуемых пользователю функций, что приводит к реализации их путем использования более высокоуровневых функций
  • Неоднозначная точка зрения (Ambiguous viewpoint). Предоставление объектной модели без указания точки зрения на нее.
  • Большой ком грязи (Big ball of mud). Система без четко выраженной структуры
  • Газовый завод (Gas factory). Необоснованно сложная структура
  • Выращивание золота (Gold Planting). Продолжение работы над задачей или проектом после отметки, после которой дополнительные затраты вносят дополнительную стоимость и при этом не создают дополнительной ценности
  • Эффект внутренней платформы (Inner platform effect). Система является настолько гибкой и настраеваемой, чтоб выглядит жалким подобием платформы разработки.
  • Игорирование входныз данных (Input kludge). Невозможность указать и реализовать обработку возможно некоректных входных данных.
  • Раздутый интерфейс (Interface bloat). Создание настолько мощного интерфейса, что его сложно реализовать.
  • Волшебная кнока (Magic push button). Реализация бизнес логики непосредственно в коде пользовательского интерфейса, отсутствие абстракции.
  • Опасность гонки (Race hazard). Отсутствие возможности увидеть последствие запросов и событий.
  • Дымоходная система (Stove pipe system). Трудно обслуживаемая система взаимосвязанных компоненитов.

Анти-паттерны анализа

· 0 коммент.

  • Апатия наблюдателя (Bystander apathy). Когда требование или дизайнерское решение неверно, но люди которые замечают это ничего не делают, посколько это затрагивает большое число людей.

Анти-паттерны управления

· 0 коммент.

  • Смертельный марш (Death March). Каждый знает, что проект является катастрофой за исключением генерального директора. Тем не менее, истина остается скрытой и жизнеспособность проекта искусственно поддерживается до часа Ч (“большого взрыва”). Существует альтернативное определение. На работников оказывается давление с целью работы до позднего вечера и в течение выходных над проектом с нереальными сроками
  • Групповое мышление (Group think). В ходе группового обсуждения члены группы избегают высказывать точки зрения вне общепринятой комофртной зоны консенсуса.
  • Дым и зеркала (Smoke and Mirrors). Демонстрация того, как будут выглядеть нереализованные функции
  • Раздувание программного обеспечения (Software bloat). Разрешение последующим версиям системы требовать все больше и больше ресурсов

Организационные анти-паттерны

· 0 коммент.

  • Паралич от анализа (Analysis paralysis). Выделение непропорцио больших затрат на стадию анализа проекта
  • Дойная корова (Cash Cow). Выгодный старый продукт, по которому часто оценивают компетентность при разработке новых продуктов.
  • Коллективное проектирование (Design Committee). Дизайн, являющийся результатом работы большого числа людей, но обладающиий единой концепцией.
  • Экскалация обязательств (Escalation of commitment). Отсутствие возможности отменить решение, если доказана его ошибочность.
  • Управление богом-громовержцем (Management by perkele). Авторитарный стиль управления без какой-либо терпимости к инакомыслию.
  • Моральный риск (Moral hazard). Изоляция человека, ответственного за решения, от последствий его решения.
  • Грибное управление (Mushroom management). Поддержание сотрудников неинформированными или дезыинформированными.
  • Дымоход (Stove pipe). Структура, которая поддерживает в основном нисходящий поток данных, но препятствует межорганизационному общению.
  • Привязка к производителю (Vendor lock-in). Создание системы чрезмерно зависящей от компонентов поставляемых третьей стороной

Введение в анти-паттерны

· 0 коммент.

В разработке программного обеспечения существует понятие анти-паттернов (anti-pattern). Анти-паттерн – это шаблон разработки, который кажется очевидным, но является неэффективным или далеким от отптимального варианта при использовании на практике.

Термин был придуман в 1995 году Андю Кенигом (Andrew Koenig) вдохновленным книгой Банды Четырех (Gang of Four) Паттерны разработки. Авторы книги разработали концепцию шаблонов проектирования в области разработки программного обеспечения. Этот термин (антипаттерны) получил широкое распространение тремя годами позже вместе с книгой Анти-Паттерны (AntiPatterns), которая вывела использование термина за рамки разработки программного обеспечения. По менению авторов книги, должны присутствовать, по крайней мере, два ключевых элемента для формального отличия анти-паттерна от плохой превычки, плохой практики или плохой идеи:

  • Некоторые повторяющиеся шаблоны действия, процесса или структуры, которые изначально кажутся выигрышными, но в конечно счете приводят к худшим результатам по сравнению с получаемой выгодой от их использования
  • Преобразованное решение (Refactored Solution), которе четко задокументировано, проверено на практике и повторяем
Часто уничижительно называмые oxymoronic neologisms, многие среди антипаттернов являются больше чем просто ошибками, разглагольствованиями, нерешаемыми проблемами или плохими практиками. Если это возможно, лучше стараться их избегать. Антипаттерны иногда называются ловушками (pitfalls) или темными шаблонами (dark patterns). Это неформальное использование термина описывает часто изобретаемые повторно плохие решение проблем.

CheckBoxList require validator

воскресенье, 14 сентября 2008 г. · 0 коммент.

I've needed to validate Check box list against whether something is checked or not. It was difficult to find working solution so i've decided to create my own validator. I've tested it on FireFox, IE and Opera. It looks like it works properly.

using System;

using System.Web.UI.WebControls;

namespace DragonSoft.RestForYou.BusinessLayer.Controls
{
/// <summary>
/// Checks where one or more items are selected on for check box list
/// </summary>
public class CheckBoxListValidator : BaseValidator
{
#region Constants

private const string ValidationScriptCode = @"
function CheckBoxValidatorIsValid(val)
{
var controlObj = document.getElementById(val.controltovalidate);

if (!controlObj)
return false;

var checkBoxList = document.getElementsByTagName('INPUT');

for (var i = 0; i < checkBoxList.length; i++)
{
if (checkBoxList[i].type != 'checkbox')
continue;

if (!IsChildOf(checkBoxList[i], controlObj))
continue;

if (checkBoxList[i].checked)
return true;
}
return false;
}


function IsChildOf(childNode, parentNode)
{
var currentParent = childNode.parentNode;

while (currentParent)
{
if (currentParent.id == parentNode.id)
return true;
currentParent = currentParent.parentNode;
}

return false;
}
"
;

private const string ValidationScriptKey = "CheckBoxValidationScript";

#endregion

#region Overriden methods

/// <summary>
/// Determines whether the control specified by the <see cref="P:System.Web.UI.WebControls.BaseValidator.ControlToValidate"/> property is a valid control.
/// </summary>
/// <returns>
/// true if the control specified by <see cref="P:System.Web.UI.WebControls.BaseValidator.ControlToValidate"/> is a valid control; otherwise, false.
/// </returns>
/// <exception cref="T:System.Web.HttpException">No value is specified for the <see cref="P:System.Web.UI.WebControls.BaseValidator.ControlToValidate"/> property.- or -The input control specified by the <see cref="P:System.Web.UI.WebControls.BaseValidator.ControlToValidate"/> property is not found on the page.- or -The input control specified by the <see cref="P:System.Web.UI.WebControls.BaseValidator.ControlToValidate"/> property does not have a <see cref="T:System.Web.UI.ValidationPropertyAttribute"/> attribute associated with it; therefore, it cannot be validated with a validation control.</exception>
protected override bool ControlPropertiesValid()
{
return FindControl(ControlToValidate) is CheckBoxList;
}


/// <summary>
/// When overridden in a derived class, this method contains the code to determine whether the value in the input control is valid.
/// </summary>
/// <returns>
/// true if the value in the input control is valid; otherwise, false.
/// </returns>
protected override bool EvaluateIsValid()
{
return EvaluateIsChecked();
}

/// <summary>
/// Raises the <see cref="E:System.Web.UI.Control.PreRender"/> event.
/// </summary>
/// <param name="e">A <see cref="T:System.EventArgs"/> that contains the event data.</param>
protected override void OnPreRender(EventArgs e)
{
if (EnableClientScript)
RegisterClientScript();

base.OnPreRender(e);
}

#endregion

#region Helper methods

/// <summary>
/// Evaluates the is checked.
/// </summary>
private bool EvaluateIsChecked()
{
foreach (ListItem listItem in ((CheckBoxList)FindControl(ControlToValidate)).Items)
{
if (listItem.Selected)
return true;
}
return false;
}

/// <summary>
/// Registers the client script.
/// </summary>
private void RegisterClientScript()
{
Page.ClientScript.RegisterExpandoAttribute(
ClientID,
"evaluationfunction",
"CheckBoxValidatorIsValid"
);

if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(CheckBoxListValidator), ValidationScriptKey))
Page.ClientScript.RegisterClientScriptBlock(
typeof(CheckBoxListValidator),
ValidationScriptKey,
ValidationScriptCode,
true);
}


#endregion
}
}

Обо мне

Моя фотография
Кто к нам с чем и зачем, тот от того и того!