riobits
3 years ago
1 changed files with 411 additions and 0 deletions
@ -0,0 +1,411 @@ |
|||
# State-of-the-Art Shitcode Principles |
|||
|
|||
[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode) |
|||
|
|||
هذه قائمة بأحدث مبادئ كود shitcode التي يجب أن يتبعها مشروعك ليطلق عليه كود shitcode المناسب. |
|||
|
|||
_اقرأ هذا في لغات أخرى:_ |
|||
[_English_](README.md), |
|||
[_简体中文_](README.zh-CN.md), |
|||
[_한국어_](README.ko-KR.md) |
|||
|
|||
## احصل على شارتك |
|||
|
|||
إذا كان repository الخاص بك يتبع أحدث مبادئ كود shitcode, فيمكنك استخدام شارة 'state-of-the-art shitcode' التالي: |
|||
|
|||
[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode) |
|||
|
|||
مصدر-الكود للشارة: |
|||
|
|||
``` |
|||
[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode) |
|||
``` |
|||
|
|||
## المبادئ |
|||
|
|||
### 💩 تسمية المتغيرات بطريقة كما لو كانت شفرتك غامضة بالفعل |
|||
|
|||
ضغطات أقل على المفاتيح, ووقت أكثر لك. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
let a = 42; |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
let age = 42; |
|||
``` |
|||
|
|||
### 💩 امزج أسلوب تسمية المتغير / الوظائف |
|||
|
|||
احتفل بالفرق. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
let wWidth = 640; |
|||
let w_height = 480; |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
let windowWidth = 640; |
|||
let windowHeight = 480; |
|||
``` |
|||
|
|||
### 💩 أبدًا لا تكتب تعليقات |
|||
|
|||
لن يقرأ أحد الكود الخاص بك على أي حال. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
const cdr = 700; |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
في كثير من الأحيان يجب أن تحتوي التعليقات على بعض 'لماذا' وليس 'ماذا'. إذا لم يكن 'ماذا' واضحًا في الكود, فمن المحتمل أن يكون الكود فوضويًا للغاية. |
|||
|
|||
```javascript |
|||
// The number of 700ms has been calculated empirically based on UX A/B test results. |
|||
// @see: <link to experiment or to related JIRA task or to something that explains number 700 in details> |
|||
const callbackDebounceRate = 700; |
|||
``` |
|||
|
|||
### 💩 اكتب دائمًا التعليقات بلغتك الأم |
|||
|
|||
إذا انتهكت مبدأ 'لا تعليقات', فحاول على الأقل كتابة تعليقات بلغة مختلفة عن اللغة التي تستخدمها لكتابة الشفرة. إذا كانت لغتك الأم هي الإنجليزية, فقد تنتهك هذا المبدأ. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
// Закриваємо модальне віконечко при виникненні помилки. |
|||
toggleModal(false); |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
// Hide modal window on error. |
|||
toggleModal(false); |
|||
``` |
|||
|
|||
### 💩 حاول مزج نمط التنسيق قدر الإمكان |
|||
|
|||
احتفل بالفرق. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
let i = ["tomato", "onion", "mushrooms"]; |
|||
let d = ["ketchup", "mayonnaise"]; |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
let ingredients = ["tomato", "onion", "mushrooms"]; |
|||
let dressings = ["ketchup", "mayonnaise"]; |
|||
``` |
|||
|
|||
### 💩 ضع أكبر قدر ممكن من الكود في سطر واحد |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
document.location.search |
|||
.replace(/(^\?)/, "") |
|||
.split("&") |
|||
.reduce(function (o, n) { |
|||
n = n.split("="); |
|||
o[n[0]] = n[1]; |
|||
return o; |
|||
}, {}); |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
document.location.search |
|||
.replace(/(^\?)/, "") |
|||
.split("&") |
|||
.reduce((searchParams, keyValuePair) => { |
|||
keyValuePair = keyValuePair.split("="); |
|||
searchParams[keyValuePair[0]] = keyValuePair[1]; |
|||
return searchParams; |
|||
}, {}); |
|||
``` |
|||
|
|||
### 💩 افشل بصمت |
|||
|
|||
عند اكتشاف خطأ ما, ليس من الضروري أن يعرفه أحد. لا سجلات, لا أنماط الخطأ, استرخي. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
try { |
|||
// Something unpredictable. |
|||
} catch (error) { |
|||
// tss... 🤫 |
|||
} |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
try { |
|||
// Something unpredictable. |
|||
} catch (error) { |
|||
setErrorMessage(error.message); |
|||
// and/or |
|||
logError(error); |
|||
} |
|||
``` |
|||
|
|||
### 💩 استخدام متغيرات global على نطاق واسع |
|||
|
|||
مبدأ العولمة. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
let x = 5; |
|||
|
|||
function square() { |
|||
x = x ** 2; |
|||
} |
|||
|
|||
square(); // Now x is 25. |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
let x = 5; |
|||
|
|||
function square(num) { |
|||
return num ** 2; |
|||
} |
|||
|
|||
x = square(x); // Now x is 25. |
|||
``` |
|||
|
|||
### 💩 قم بإنشاء متغيرات لن تستخدمها. |
|||
|
|||
تحسبُاً. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
function sum(a, b, c) { |
|||
const timeout = 1300; |
|||
const result = a + b; |
|||
return a + b; |
|||
} |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
function sum(a, b) { |
|||
return a + b; |
|||
} |
|||
``` |
|||
|
|||
### 💩 لا تحدد الأنواع و/أو لا تفعل عمليات التحقق من الكتابة إذا كانت اللغة تسمح لك بذلك. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
function sum(a, b) { |
|||
return a + b; |
|||
} |
|||
|
|||
// Having untyped fun here. |
|||
const guessWhat = sum([], {}); // -> "[object Object]" |
|||
const guessWhatAgain = sum({}, []); // -> 0 |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
function sum(a: number, b: number): ?number { |
|||
// Covering the case when we don't do transpilation and/or Flow type checks in JS. |
|||
if (typeof a !== "number" && typeof b !== "number") { |
|||
return undefined; |
|||
} |
|||
return a + b; |
|||
} |
|||
|
|||
// This one should fail during the transpilation/compilation. |
|||
const guessWhat = sum([], {}); // -> undefined |
|||
``` |
|||
|
|||
### 💩 يجب أن يكون لديك جزء من الكود لا يمكن الوصول إليه |
|||
|
|||
هذه هي "خطتك ب". |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
function square(num) { |
|||
if (typeof num === "undefined") { |
|||
return undefined; |
|||
} else { |
|||
return num ** 2; |
|||
} |
|||
return null; // This is my "Plan B". |
|||
} |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
function square(num) { |
|||
if (typeof num === "undefined") { |
|||
return undefined; |
|||
} |
|||
return num ** 2; |
|||
} |
|||
``` |
|||
|
|||
### 💩 مبدأ المثلث |
|||
|
|||
كن مثل الطائر - nest, nest, nest. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
function someFunction() { |
|||
if (condition1) { |
|||
if (condition2) { |
|||
asyncFunction(params, (result) => { |
|||
if (result) { |
|||
for (;;) { |
|||
if (condition3) { |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
async function someFunction() { |
|||
if (!condition1 || !condition2) { |
|||
return; |
|||
} |
|||
|
|||
const result = await asyncFunction(params); |
|||
if (!result) { |
|||
return; |
|||
} |
|||
|
|||
for (;;) { |
|||
if (condition3) { |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
|
|||
### 💩 العبث مع المسافات البادئة |
|||
|
|||
تجنب المسافات البادئة لأنها تجعل الكود معقد, يشغل مساحة أكبر في المحرر. إذا كنت لا ترغب في تجنبهم, فما عليك سوى العبث معهم. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
const fruits = ["apple", "orange", "grape", "pineapple"]; |
|||
const toppings = ["syrup", "cream", "jam", "chocolate"]; |
|||
const desserts = []; |
|||
fruits.forEach((fruit) => { |
|||
toppings.forEach((topping) => { |
|||
desserts.push([fruit, topping]); |
|||
}); |
|||
}); |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
const fruits = ["apple", "orange", "grape", "pineapple"]; |
|||
const toppings = ["syrup", "cream", "jam", "chocolate"]; |
|||
const desserts = []; |
|||
|
|||
fruits.forEach((fruit) => { |
|||
toppings.forEach((topping) => { |
|||
desserts.push([fruit, topping]); |
|||
}); |
|||
}); |
|||
``` |
|||
|
|||
### 💩 لا تقفل dependencies الخاصة بك |
|||
|
|||
قم بتحديث تبعياتك على كل تثبيت جديد بطريقة غير خاضعة للرقابة. لماذا نتمسك بالماضي, دعنا نستخدم أحدث إصدارات المكتبات. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
``` |
|||
$ ls -la |
|||
|
|||
package.json |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
``` |
|||
$ ls -la |
|||
|
|||
package.json |
|||
package-lock.json |
|||
``` |
|||
|
|||
### 💩 قم دائمًا بتسمية القيمة المنطقية بـ `flag` |
|||
|
|||
اترك مساحة لزملائك للتفكير في معنى القيمة المنطقية. |
|||
|
|||
_جيد 👍🏻_ |
|||
|
|||
```javascript |
|||
let flag = true; |
|||
``` |
|||
|
|||
_سيئ 👎🏻_ |
|||
|
|||
```javascript |
|||
let isDone = false; |
|||
let isEmpty = false; |
|||
``` |
|||
|
|||
### 💩 قرائة الوظائف الطويلة افضل من القصيرة |
|||
|
|||
لا تقسم منطق البرنامج إلى أجزاء يمكن قراءتها. ماذا لو تعطل بحث IDE الخاص بك ولم تتمكن من العثور على الملف أو الوظيفة اللازمة؟ |
|||
|
|||
- 10000 سطر من الكود في ملف واحد جيد. |
|||
- 1000 سطر من الكود في ملف واحد جيد. |
|||
- التعامل مع العديد من الخدمات (طرف ثالث وداخلي, أيضا, هناك بعض المساعدين, database hand-written ORM jQuery slider) في `service.js` واحد؟ جيد. |
|||
|
|||
### 💩 تجنب تغطية الكود الخاص بك بالاختبارات |
|||
|
|||
هذا هو كمية مكررة وغير ضرورية من العمل. |
|||
|
|||
### 💩 بأقصى ما يمكنك تجنب code linters |
|||
|
|||
اكتب الكود كما تريد, خاصة إذا كان هناك أكثر من مطور واحد في الفريق. هذا هو مبدأ "الحرية". |
|||
|
|||
### 💩 ابدأ مشروعك بدون ملف README. |
|||
|
|||
واحتفظ بها بهذه الطريقة في الوقت الحالي. |
|||
|
|||
### 💩 يجب أن يكون لديك كود غير ضروري |
|||
|
|||
لا تحذف الكود الذي لا يستخدمه تطبيقك. على الأكثر, قم بالتعليق عليه. |
Loading…
Reference in new issue