رمز نظيف لـ TypeScript - الجزء الأول

بعد أن عثرت على المادة وفقًا لمبادئ الشفرة النظيفة لبرنامج TypeScript وقراءتها ، قررت أن أتناول ترجمتها. أريد هنا أن أشاطركم بعض المقتطفات من هذه الترجمة ، نظرًا لأن بعض نقاط شفرة TypeScript الخالصة تكرر نفس المبادئ لجافا سكريبت ، ولن أصفها هنا ، إذا كان ذلك سيكون ممتعًا ، فقد تم نشر ترجمة JS بالفعل على المحور (@ BoryaMogila ) أو يمكنك التعرف على نفسك في المصدر الأصلي .



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


المتغيرات


استخدام التعداد لتوثيق


يمكن أنام تساعد في توثيق التعليمات البرمجية الخاصة بك. على سبيل المثال ، عندما نشعر بالقلق من أن المتغيرات لدينا تختلف عن القيم.


الفقراء:


const GENRE = { ROMANTIC: 'romantic', DRAMA: 'drama', COMEDY: 'comedy', DOCUMENTARY: 'documentary', } projector.configureFilm(GENRE.COMEDY); class Projector { // delactation of Projector configureFilm(genre) { switch (genre) { case GENRE.ROMANTIC: // some logic to be executed } } } 

حسن:


 enum GENRE { ROMANTIC, DRAMA, COMEDY, DOCUMENTARY, } projector.configureFilm(GENRE.COMEDY); class Projector { // delactation of Projector configureFilm(genre) { switch (genre) { case GENRE.ROMANTIC: // some logic to be executed } } } 

وظائف


تجنب التحقق من النوع


TypeScript عبارة عن مجموعة فرعية من بناء جملة JavaScript وتضيف اختبارات نوع ثابتة إضافية للغة. تفضل دائمًا تحديد أنواع المتغيرات والمعلمات وقيم الإرجاع للاستفادة الكاملة من TypeScript. وهذا يجعل إعادة بناء المستقبل أسهل.


الفقراء:


 function travelToTexas(vehicle: Bicycle | Car) { if (vehicle instanceof Bicycle) { vehicle.pedal(currentLocation, new Location('texas')); } else if (vehicle instanceof Car) { vehicle.drive(currentLocation, new Location('texas')); } } 

حسن:


 type Vehicle = Bicycle | Car; function travelToTexas(vehicle: Vehicle) { vehicle.move(currentLocation, new Location('texas')); } 

استخدام التكرارات والمولدات


استخدم المولدات والتكرارات عند العمل مع مجموعات البيانات المستخدمة كدفق.
هناك عدة أسباب لهذا:


  • يفصل الكائن المدعو عن تطبيق المولد بمعنى أن الكائن المدعو يقرر عدد العناصر
    يكون للوصول
  • تنفيذ كسول ، يتم تمرير العناصر على الطلب
  • دعم مدمج لعناصر التكرار باستخدام بناء الجملة
  • تتيح لك التكرارات تنفيذ أنماط التكرار المحسنة

الفقراء:


 function fibonacci(n: number): number[] { if (n === 1) return [0]; if (n === 2) return [0, 1]; const items: number[] = [0, 1]; while (items.length < n) { items.push(items[items.length - 2] + items[items.length - 1]); } return items; } function print(n: number) { fibonacci(n).forEach(fib => console.log(fib)); } // Print first 10 Fibonacci numbers. print(10); 

حسن:


 // Generates an infinite stream of Fibonacci numbers. // The generator doesn't keep the array of all numbers. function* fibonacci(): IterableIterator<number> { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } function print(n: number) { let i = 0; for (const fib of fibonacci()) { if (i++ === n) break; console.log(fib); } } // Print first 10 Fibonacci numbers. print(10); 

توجد المكتبات التي تسمح لك بالعمل مع التكرارات بنفس الطريقة مثل المصفوفات الخاصة بك ، من خلال forEach الطرق مثل map ، slice ، forEach ، وما إلى ذلك. راجع مثال itiriri لمعالجة متقدمة من التكرارات (أو المتزامن itiriri لمعالجة التكرارات غير المتزامنة).


 import itiriri from 'itiriri'; function* fibonacci(): IterableIterator<number> { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } itiriri(fibonacci()) .take(10) .forEach(fib => console.log(fib)); 

الكائنات وهياكل البيانات


استخدام getters و setters


يدعم TypeScript بناء الجملة من getters و setters. يعد استخدام getters و setters للوصول إلى بيانات الكائن أفضل بكثير من الوصول مباشرة إلى خصائصه. "لماذا؟" أنت تسأل. فيما يلي قائمة بالأسباب:


  • إذا كنت تريد تنفيذ أكثر من مجرد الوصول إلى خاصية ، فأنت بحاجة إلى تغيير التطبيق في مكان واحد ، وليس في جميع أنحاء الرمز
  • التحقق من الصحة سهل التنفيذ على مستوى التنفيذ set
  • تغليف الحالة الداخلية
  • من السهل إضافة تسجيل ومعالجة الأخطاء في مستوى getter و setter
  • يمكنك تحميل خصائص الكائن الخاص بك ، على سبيل المثال ، من الخادم

الفقراء:


 type BankAccount = { balance: number; // ... } const value = 100; const account: BankAccount = { balance: 0, // ... }; if (value < 0) { throw new Error('Cannot set negative balance.'); } account.balance = value; 

حسن:


 class BankAccount { private accountBalance: number = 0; get balance(): number { return this.accountBalance; } set balance(value: number) { if (value < 0) { throw new Error('Cannot set negative balance.'); } this.accountBalance = value; } // ... } //  `BankAccount`   . //    ,      , //      ``, //      . const account = new BankAccount(); account.balance = 100; 

إنشاء كائنات مع الحقول الخاصة / آمنة


يدعم TypeScript الوسائل public (الافتراضية) protected private للوصول إلى خصائص الفصل.


الفقراء:


 class Circle { radius: number; constructor(radius: number) { this.radius = radius; } perimeter() { return 2 * Math.PI * this.radius; } surface() { return Math.PI * this.radius * this.radius; } } 

حسن:


 class Circle { constructor(private readonly radius: number) { } perimeter() { return 2 * Math.PI * this.radius; } surface() { return Math.PI * this.radius * this.radius; } } 

أعزائي القراء ، ما هي المبادئ التي تستخدمها عند استخدام برنامج TypeScript؟


أن تستمر ...

Source: https://habr.com/ru/post/ar484402/


All Articles