Javascript: я должен скрывать свои реализации? - PullRequest
5 голосов
/ 11 июля 2010

Как программист на C #, у меня есть привычка делать вещи приватными, которые могут и должны быть приватными, и у меня всегда возникает странное чувство, когда тип JS выставляет мне все свои приватные части (и это чувство не 'вызвал'). Скажем, у меня есть тип, который имеет метод draw, который внутренне вызывает drawBackground и drawForeground, которые не имеют смысла вызываться самостоятельно. Как мне это реализовать?

Вариант 1

Foo = function(){
  this.draw();  
};

Foo.prototype.draw = function(){
  this.drawBackground();
  this.drawForeground();
};

Foo.prototype.drawBackground = function(){};
Foo.prototype.drawForeground = function(){};

Вариант 2

Foo = (function(){

  var constructor = function(){
    this.draw();
  };

  var drawBackground = function(){};
  var drawForeground = function(){};

  constructor.prototype.draw = function(){
    drawBackground.call(this);
    drawForeground.call(this);
  };

  return constructor;

})();

Разница, конечно, заключается в том, что в первом примере методы drawBackground и drawForeground являются частью общедоступного API, а во втором они скрыты для внешнего использования. Это желательно? Какой из них я предпочитаю? Я ошибаюсь, применяя свои привычки C # к Javascript, и я должен сделать все расширяемым и переопределяемым в Javascript? И каковы последствия производительности .call(this)?

1 Ответ

7 голосов
/ 11 июля 2010

Среди разработчиков Perl есть известная цитата из (в) известной книги Camel: «Модуль Perl предпочел бы, чтобы вы не входили в его гостиную, потому что вас не пригласили, а не потому, что у него есть дробовик.».Философия заключается в том, что если вы, как разработчик библиотеки, хотите различать ваш публичный и частный API, это здорово.Сделайте это и задокументируйте это.Вызывающий ваш код должен знать, что есть что, но также должен быть свободен, чтобы действовать как идиот, если он решит и называть вещи, которые, как вы думаете, они не должны вызывать.С точки зрения ОО, это еретично, но с языками сценариев, вот как они катятся.

Ответ на это немного субъективен, но я скажу вам, что когда я пишу JavaScript и у меня есть методы илипеременные, которые были бы приватными, если бы я кодировал в .NET, я просто добавляю к ним префикс с чем-то вроде "prv_" или "p_" или просто "_" ... что угодно, что плавает в вашей лодке.Таким образом, вы сказали своим пользователям, что этот материал предназначен для частного использования и может измениться из-под них.И таким образом, если они все равно захотят вызывать ваши приватные методы, этот ненадежный код будет торчать, как больной большой палец.

...