Как перейти с объектно-ориентированного языка на серверную сторону Node.js Javascript для больших проектов? - PullRequest
4 голосов
/ 24 октября 2010

Я решил привыкнуть к использованию Javascript в качестве языка моего сервера (я использую Node.js) для настройки веб-сервера, создания серверных демонов и многого другого.Это довольно большой проект, а это значит, что мне нужно привыкнуть к языку и получить оптимальные настройки, прежде чем я действительно начну избегать лишних хлопот и ненужных хлопот.

Я искал источники, которые объясняли быосновы функционального программирования в больших проектах.К сожалению, большинство источников говорят только о базовом Javascript, предназначенном для простых приемов в браузере.

Две полезные ссылки, объясняющие, как создание объектов работает в Javascript, были http://howtonode.org/object-graphs и http://howtonode.org/object-graphs-2.

В конце концов, наиболее разумно создать такой объект, как:

function MyObject(constructorMemberOne, constructorMemberTwo) {
   this.constructorMemberOne = constructorMemberOne;
   this.constructorMemberTwo = constructorMembertwo;
   this.doSomething = function doSomething() {
       //
   }
}

Теперь я ищу полную ссылку на язык Javascript.Пока что https://developer.mozilla.org/en/JavaScript/Reference представляется наиболее полным.

В1: это рекомендуемая ссылка на язык ECMAScript?Я спрашиваю, в основном, потому что его источником является компания, которая в основном работает в индустрии браузеров, но Javascript предназначен не только для браузеров - возможно, есть источники, о которых я не знаю.

Во-вторых, я 'Я использовал для создания нового файла для каждого класса, который я создаю, где имя файла представляет имя класса.В2: Эта практика рекомендуется также в Javascript (V8, Node.js)?Как можно «импортировать» этот класс?

Этот «импорт» приводит меня в замешательство по поводу «require» в Node.js.Я знаю, что это не то же самое.По сути, Require загружает другой файл, который затем имеет собственное пространство имен, а это означает, что его переменные находятся вне области действия файла, для которого требуется этот файл.Для моих классов, однако, я хочу иметь методы, которые доступны для класса, который «импортирует» (цитирует, так как я не уверен, возможно ли это вообще) этого класса.Например:

var utils = require("utils/MainUtils.js");
utils.doSomething();

Насколько я знаю, этот метод doSomething () доступен только в том случае, если он был задан следующим образом:

function MainUtils() {
   exports.doSomething = function doSomething() {
      //
   }
}

В3: Это правильно?Разве это не кажется ненормальным?

Q4: Существуют ли другие блоги или ресурсы, которые могут помочь в работе моей установки, например howtonode.org?

Наконец, Q5: были ликакие-либо усилия по упрощению наследования, создания объектов, структуры проекта, пространства имен и т. д. для больших проектов?Какие-нибудь библиотеки или что-то для этого?

Надеюсь, мои вопросы понятны.Любая помощь приветствуется.Спасибо.

Ответы [ 4 ]

4 голосов
/ 24 октября 2010

является ли это рекомендуемой ссылкой на язык ECMAScript?

Ну, официальная ссылка на язык ECMAScript - это ECMA-262 .Но, к сожалению, это совершенно нечитаемо даже по стандартам документов стандартов.

ECMA не выпускает никаких материалов, предназначенных для конечных программистов, и нет ни одного учебника, который считается «лучшим».Ссылка MDC выглядит прилично, по крайней мере.(Большинство руководств по JavaScript абсолютно ужасны и полны ошибок. Отчасти это вина JavaScript за то, что у них так много ... причудливых ... функций, но все же.)

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

К сожалению, не существует общепринятого «лучшего» способа реализации системы класса / экземпляра в JavaScript.Многие фреймворки имеют свои собственные системы, или вы можете создавать свои собственные.Ваш пример кода создает новый экземпляр каждого метода для каждого экземпляра объекта, который вы можете считать неоптимальным по сравнению с собственным прототипированием JS.(Обычно этот подход используется с var that= this в замыкании, чтобы избежать проблем с привязкой this в коде обратного вызова.) Вам также необходимо проявить осторожность при создании подклассов и их инициализации в конструкторах.

См. этот вопрос для обсуждения подходов к классу / экземпляру в JS.

Я привык создавать новый файл для каждого создаваемого мной класса

Да, это Java-бородавка, которую не следует приносить в JS.

Храните исходные файлы в управляемых кусках связанных классов и функций.Иногда это будет один публичный класс на файл, чаще всего не будет.

Как можно "импортировать" этот класс?

Сам JS не имеет собственногоимпортировать функциональность.В браузерах вы делаете это, вставляя теги <script> или eval в код, извлекаемый с помощью XMLHttpRequest, и вам нужно вручную хранить переменные в отдельных пространствах имен.В Node.js и других местах, где вы работаете с CommonJS, вы используете модули и require().

Это правильно?

Да.

Разве это не кажется совершенно ненормальным?

Я так не думаю.Это похоже на другие языки сценариев, где это оказывается очень полезным.Только на самом деле Java заставляет вас объединить модуль компиляции в один класс.

3 голосов
/ 26 октября 2010

Я придумал следующее после прочтения книги «Шаблоны проектирования Pro Javascript».Тем не менее, мне сказали, что в Javascript неправильно думать (приватно, публично, статично и т. Д.) Следующим образом:

var SomeClass = (function() {
    this.prototype.publicStaticMember = "this is a public static variable",

    this.prototype.publicStaticMethod = function() {
        return "this is a public method: cannot access private members/methods, but can access privileged and public members/methods";
    }

    var privateStaticMember = "this is a private static variable";

    function privateStaticMethod() {
        return "this is a private static method: can only access private members/methods";
    }

    //instance part
    return function() {
        this.publicInstanceMember = "this is a public instance variable";

        var privateInstanceMember = "this is a private instance variable";

        this.publicInstanceMethod = function() {
            return "this is a privileged method: can access both public and private members/methods";
        }

        var privateInstanceMethod = function() {
            return "this is a private method: can access both public and private members/methods but is private";
        }
    }
})();

Это будет реализовано так:*

Есть комментарии?Стоит ли читать другую книгу?

1 голос
/ 04 ноября 2010

Если вы еще этого не сделали, посмотрите видео Дугласа Крокфорда. У него есть несколько видеороликов, в которых рассказывается о прототипных аспектах JavaScript.

Google для «Видео Дугласа Крокфорда на языке программирования Java». Вот ссылка на первую часть серии: http://video.yahoo.com/watch/111593/1710507

0 голосов
/ 22 мая 2012

Пакет defineClass npm предоставляет простой, но мощный ООП для JavaScript с поддержкой свойств (mixins) и вложенных классов. Вот пример использования:

var defineClass = require("defineClass").defineClass;

var Person = defineClass({
  cash: 0,
  constructor: function (firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  },

  greet: function (name) {
    console.log("Hello " + name + ". My name is " + this.firstName);
  },

  earn: function (amount) {
    this.cash += amount;
  }
});

var Developer = defineClass({
  _super: Person,

  // override a field default value
  cash: 100,

  // override the constructor
  constructor: function (firstName, lastName, language) {
    // you may have code before the base constructor call

    // call the base constructor
    this._super(firstName, lastName);
    this.language = language;
  }

  // override a method
  greet: function (name) {
    console.log("Hey, " + name + ". I'm " + this.firstName)
  },

  // override a method and call its base method
  earn: function (amount) {
    return this._super(amount * 1.2);
  }
});

Подробнее читайте в readme: https://github.com/nodirt/defineClass

Установка:

$ npm install defineClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...