Какие шаблоны разработки недостаточно используются? [закрытый]

Хорошо, вот мое решение. Ожидание ответа об ошибке, но пока:

var adj = (window.screen.width == window.outerWidth) ? 0 : -15
var maxScreenWidth = window.innerWidth * (window.screen.width / (window.outerWidth + adj))
if (parseInt(maxScreenWidth) != maxScreenWidth) maxScreenWidth = window.screen.width
11
задан BalusC 2 June 2010 в 20:37
поделиться

5 ответов

Steve Yegge записал (обычно) длинную запись в блоге о Шаблоне Интерпретатора, предъявив претензию, что этот шаблон является единственным шаблоном GoF, который может сделать код "меньшим", и преступно недостаточно используется программистами, которые иначе довольно довольны другими шаблонами GoF. Я - один из тех программистов - я никогда не использовал шаблон Интерпретатора, хотя я распознаю, что это - важность для вещей как DSL's. Так или иначе это - очень заставляющее думать эссе, если у Вас есть храбрость, чтобы прочитать все сообщение Yegge.

8
ответ дан 3 December 2019 в 04:34
поделиться

Шаблон "посетитель", кажется, трудно понять для многих новых разработчиков. Я использовал его для исчисления, когда у меня была возможность получить значение для Страны> состояние> Город> Дом. Таким образом, у меня нет потребности измениться, сколько данные имели в каждом sub наборе. Я просто выбираю правильного посетителя, и окончательный ответ был, добираются что количество стран, состояний или городов.

4
ответ дан 3 December 2019 в 04:34
поделиться

Стратегическая модель, возможно? Я вижу не много человека, использующего его, и довольно полезно, когда вычисления изменяются или могут быть накоплены вместе. Я использую его, когда часть вычисления может быть заменена другим вычислением. Часто в программе, которые используют для уровня предприятия для продукта.

Вот некоторая документация:

5
ответ дан 3 December 2019 в 04:34
поделиться

У посетителя есть плохая репутация, частично из-за некоторых настоящих проблем

  • циклическая зависимость между иерархиями Vistor и Visited
  • это, как предполагается, разрушает инкапсуляцию путем представления Посещаемых внутренностей классов

и частично из-за выставки в книге GOF, которая подчеркивает обход структуры вместо того, чтобы добавить виртуальные функции к закрытой иерархии.

Это означает, что не становится продуманным в соответствующих случаях, например, для решения двойной проблемы отправки на статически типизированных языках. Пример: сообщение или событие передающая система в C++, где типы сообщений фиксируются, но мы хотим расшириться путем добавления новых получателей. Здесь, сообщения являются просто структурами, таким образом, мы не заботимся об инкапсуляции их. SendTo() не знает какой Message или MessageRecipient имеет.

#include <iostream>
#include <ostream>
using namespace std;

// Downside: note the cyclic dependencies, typically expressed in
// real life as include file dependency. 
struct StartMessage;
struct StopMessage;

class MessageRecipient
{
public:
    // Downside: hard to add new messages
    virtual void handleMessage(const StartMessage& start) = 0;
    virtual void handleMessage(const StopMessage& stop) = 0;
};

struct Message
{
    virtual void dispatchTo(MessageRecipient& r) const = 0;
};

struct StartMessage : public Message
{
    void dispatchTo(MessageRecipient& r) const
    {
        r.handleMessage(*this);
    }
    // public member data ...
};

struct StopMessage : public Message
{
    StopMessage() {}

    void dispatchTo(MessageRecipient& r) const
    {
        r.handleMessage(*this);
    }
    // public member data ...
};

// Upside: easy to add new recipient
class RobotArm : public MessageRecipient
{
public:
    void handleMessage(const StopMessage& stop)
    {
        cout << "Robot arm stopped" << endl;
    }

    void handleMessage(const StartMessage& start)
    {
        cout << "Robot arm started" << endl;
    }
};

class Conveyor : public MessageRecipient
{
public:
    void handleMessage(const StopMessage& stop)
    {
        cout << "Conveyor stopped" << endl;
    }

    void handleMessage(const StartMessage& start)
    {
        cout << "Conveyor started" << endl;
    }
};

void SendTo(const Message& m, MessageRecipient& r)
{
    // magic double dispatch
    m.dispatchTo(r);
}

int main()
{
    Conveyor c;
    RobotArm r;

    SendTo(StartMessage(), c);
    SendTo(StartMessage(), r);
    SendTo(StopMessage(), r);
}
5
ответ дан 3 December 2019 в 04:34
поделиться

Если мы говорим non-GOF шаблоны затем, Объект Монитора 'Привет Мир' параллельного программирования OO. Я поражен, сколько программистов удается не услышать о нем или предпочесть разрабатывать их собственные специальные схемы синхронизации.

2
ответ дан 3 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: