كيف تنتقل من اللغة القائمة على الكائن إلى Server Side Node.js JavaScript للمشاريع الكبيرة؟

StackOverflow https://stackoverflow.com/questions/4008766

سؤال

لقد قررت أن أعتاد على استخدام JavaScript حيث أن لغة Side Side (أنا أستخدم Node.js) لإعداد خادم الويب ، وإنشاء deamons الخادم وغير ذلك الكثير. هذا مشروع كبير إلى حد ما ، مما يعني أنه يتعين علي التعود على اللغة والحصول على إعداد مثالي قبل البدء فعليًا في تجنب النفقات العامة وغير الضرورية.

لقد كنت أبحث عن مصادر تشرح أساسيات البرمجة الوظيفية في المشاريع الكبيرة. لسوء الحظ ، تتحدث معظم المصادر عن 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 ليست موجودة فقط للمتصفحات - ربما هناك مصادر لا أدري بها.

ثانياً ، أنا معتاد على إنشاء ملف جديد لكل فئة أقوم بإنشائها حيث يمثل اسم الملف اسم الفصل. Q2: هل هذه الممارسة الموصى بها في JavaScript (V8 ، Node.js) أيضًا؟ كيف يمكن للمرء "استيراد" هذا الفصل؟

هذا "استيراد" يقودني إلى مربك حول Node.js's "المتطلبات". أعلم أن الأمر ليس هو نفسه. تتطلب بشكل أساسي تحميل ملف آخر يحتوي على مساحة اسمه الخاصة ، مما يعني أن المتغيرات خارج نطاق الملف الذي يتطلب هذا الملف. ومع ذلك ، فأريد أن يكون لدي أساليب متاحة للفصل "استيراد" (اقتباسات لأنني لست متأكدًا مما إذا كان هذا ممكنًا). على سبيل المثال:

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

على حد علمي ، فإن طريقة dosomething () متاحة فقط إذا تم تعيينها مثل:

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

س 3: هل هذا صحيح؟ ألا يبدو ذلك غير طبيعي تمامًا؟

س 4: هل هناك أي مدونات أو موارد أخرى مفيدة في عمل الإعداد الخاص بي ، مثل howtonode.org؟

أخيرًا ، Q5: هل كانت هناك أي جهود لجعل كل هذا الميراث ، إنشاء الكائنات ، بنية المشروع ، تسليم الأسماء وما إلى ذلك أسهل بالنسبة للمشاريع الكبيرة؟ أي مكتبات أو شيء من هذا القبيل؟

آمل أن تكون أسئلتي واضحة. أي مساعدة موضع تقدير. شكرًا.

هل كانت مفيدة؟

المحلول

هل هذا هو مرجع لغة 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().

هل هذا صحيح؟

نعم.

ألا يبدو ذلك غير طبيعي تمامًا؟

أنا لا أعتقد ذلك. إنه يشبه لغات البرمجة النصية الأخرى ، حيث تثبت مفيدة للغاية. إنها فقط جافا التي تجبرك على اختتام وحدة التجميع في فئة واحدة.

نصائح أخرى

توصلت إلى ما يلي بعد قراءة كتاب بعنوان Pro JavaScript Design Patterns. ومع ذلك ، قيل لي إنه ليس من الجيد التفكير مثل هذا (خاص ، عام ، ثابت ، إلخ) في جافا سكريبت:

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";
        }
    }
})();

سيتم إنشاء مثيل له مثل هذا:

var someInstance = new SomeClass().("param1", "param2");

أي تعليقات؟ هل يجب أن أقرأ كتابًا آخر؟

إذا لم تقم بذلك بالفعل ، فقم بالاطلاع على مقاطع الفيديو التي كتبها Douglas Crockford. لديه مجموعة من مقاطع الفيديو التي تتحدث عن الجوانب النموذجية لجافا سكريبت.

Google for 'Douglas Crockford Java Programming Video'. فيما يلي رابط للجزء الأول في السلسلة: http://video.yahoo.com/watch/111593/1710507

ال explass توفر حزمة NPM OOP بسيطة ولكنها قوية لـ 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top