2009-03-02 4 views
18

Итак ... возиться в JavaScript с идеей, которая для меня новая, имея методы Object, которые возвращают Object, из которых они являются методами; это приводит к сцепляемости. Тогда мой вопрос: как это может быть полезно? Я бросил это вместе, чтобы проверить фундаментальные разработки:Цепочка метода JavaScript: полезно?

<script> 
MathChain = function() 
{ 
    this.pass = function() 
    { 
     this.multiply = eval(arguments.join('*')); 
     this.add = eval(arguments.join('+')); 
     return this; 
    } 
} 

m = new MathChain().pass(5, 10, 20).multiply; // 1000 
a = new MathChain().pass(5, 10, 20).add;  // 35 
</script> 

Это, очевидно, не злобно эффективный пример, в котором можно было бы использовать эту концепцию, поэтому не могли бы вы указать мне на то, что это сделать это правильно (помимо JQuery, пожалуйста)?

ответ

23

Ну, вот пример применения не очень реального мира, но я думаю, вы получите эту идею. Если позволяет выполнять несколько различных операций над объектом и обеспечивает удобство.

var truck = function() { 

    this.turnLeft = function { 

     // turn left 
     return this; 

    } 

    this.turnRight = function { 

     // turn right 
     return this; 

    } 

    this.goReallyFast = function { 

     // go fast! 
     return this; 

    } 

}; 

// My get-away plan 
var myTruck = new truck(); 
myTruck.turnLeft().turnRight().goReallyFast(); 
+0

Хех, мне нравится; он определенно демонстрирует потенциальный прецедент очень хорошо. Ум ... нет реального использования, кроме того, как это реализовано в разных библиотеках? –

+0

Хммм, я думаю, я понимаю, к чему вы клоните. Вы решаете вопрос эффективности? Я всегда рассматривал это как вопрос удобства. Я знаю, что некоторые люди думают, что цепочка менее читаема, чем каждый метод в своей собственной линии. – jonstjohn

+0

@ jonstjohn, я хотел бы знать плюсы и минусы для цепочки? –

7

Свободный интерфейс - http://en.wikipedia.org/wiki/Fluent_interface

Да я думаю, что это может быть очень полезно, но, как и любой шаблон проектирования следует использовать только при необходимости

Edit: здесь твиттер клиент API в C# с использованием свободно интерфейс - http://code.google.com/p/tweetsharp/

8

Для совершенно другого (не-OO) примера, цепочка несколько аналогична Unix pipelines. Каждый шаг трубы Unix возвращает полный (модифицированный) контент, подходящий для отправки к следующему шагу:

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g' 
6

Одним из примеров, где это полезно есть с небольшим изменением по вашей проблеме — вместо возвращения того же объект , вы проектируете объект неизменным. Затем ваши функции возвратят новый экземпляр того же типа, но с уже установленными свойствами.

У этого есть много практических приложений, особенно в области функционального программирования.

+0

Хм ... это будет вернуть this.clone(), тогда? –

+0

um ... вроде, но я не уверен, что вы еще поняли эту концепцию. Все в порядке: неизменные объекты непросты. Посмотрите на класс .Net String для хорошего примера, чтобы начать работу. –

+0

Это очень интересный момент, который изначально скрыт для новичков в программировании. Возвращение объекта в сторону нового объекта иногда неочевидно. Основная проблема заключается в том, что если вы не создаете новые объекты, иногда это приводит к тому, что дескрипторы указывают на один и тот же объект, а newbs будут запутываться, когда изменяются обе переменные, когда они изменяют только одну переменную. – trusktr

1

В JavaScript это все время появляется при навигации по DOM. В частности, когда вы пытаетесь пробираться сквозь кучу элементов, которые не имеют идентификаторов.

Например, был вопрос о SO относительно finding the first element of a table. Он может включать в себя множество циклов или цепочки команд.

3

Хотя он не работает так же, как ваш пример (TBH, я никогда не видел, чтобы это делалось раньше), jquery considers "chaining" to be very useful, а jquery в значительной степени является мерилом в наши дни, когда дело доходит до веб-фреймворков JS. .. так да :-)

-2

Все дети любят цепочки. Однако, по моему опыту, его следует использовать с осторожностью, поскольку он может уменьшить читаемость кода. Другими словами, сделайте то, что имеет смысл для вас и может быть легко понято другими программистами, которые имеют базовое знакомство с концепцией.

+7

Я perosonally не думаю, что это испортит читаемость, если имена методов названы в приятной манере. 'car.turnLeft(). turnRight(). goStraight(). stop();' мне кажется, не трудно читать. – trusktr

+0

Цепочка - способ улучшить читаемость. Как правило, разработчики считают, что что-то «нечитаемо», когда видит что-то новое, потому что они просто незнакомы с ним. – E10

0

Цепочка JavaScript может быть очень полезна, если вы хотите преформировать серию действий на одном объект. Я согласен с Майклом Лутоном ниже, с цепью следует обращаться осторожно. Если вы добавите один или два прикованных метода к объекту, который все еще доступен для чтения. Если вы начинаете добавлять четыре, пять или даже девять, то ваш код становится сложнее не только читать, но и поддерживать.

3

Этот вопрос я нашел во время поиска общего решения о методах создания цепочки после их определения. Вот что я придумал.Я неофит JavaScript; Покупатель, будь осторожен.

makeChainable = function() { 
    var receiver = arguments[0] 
    for (var i = 1; i < arguments.length; i++) { 
     functionName = arguments[i]; 
     (function() { 
      wrapped = receiver[functionName]; 
      receiver[functionName] = function() { 
       wrapped.apply(receiver, arguments); 
       return receiver; 
      } 
     })(); 
    } 
} 

daisy = { 
    name: 'Daisy', 
    moo: function() { console.log(this.name + " moos!") } 
} 

makeChainable(daisy, 'moo'); 
daisy.moo().moo().moo(); 
Смежные вопросы