سلام گرم خدمت شما همراهان آکادمی روکسو، در دنیای برنامه نویسی و مخصوصا دنیای جاوا اسکریپت قرارداد های مختلفی وجود دارد. فلسفه ی وجود این قراردادها از آن جا نشات می گیرد که در زبان هایی مثل جاوا اسکریپت می توان یک کد را به چندین شکل مختلف نوشت و افراد و محققین به جهت نظم بخشیدن به این تفاوت ها و یکسان کردن آن ها قرارداد هایی را وضع کردند. امروزه اکثر زبان های برنامه نویسی یک قرارداد استاندارد برای کد نویسی دارند و ما می خواهیم امروز به قرارداد های مربوط به زبان جاوا اسکریپت بپردازیم.
سوالی که در ذهن متبادر می شود این است که قراردادهای کدنویسی با قوانین کدنویسی چه تفاوتی دارند؟ قوانین کد نویسی قراردادهایی محکم و ثابت هستند که اگر آن ها را رعایت نکنید با خطا مواجه می شوید و اجرای کدهایتان متوقف می شود اما قراردادهای کدنویسی (همانطور که از نامشان مشخص است) تنها یک قرارداد هستند.
به معنی آنکه عده ای قبول کرده اند به این شکل کد نویسی کنند و اگر آن ها را رعایت نکنید مشکلی برایتان پیش نمی آید.
ما در این مقاله هر دوی قوانین و قراردادها را مخلوط کرده و به صورت یک مجموعه ی کامل تقدیم شما می کنیم. باید نکته ی مهمی را به یاد داشته باشید: ممکن است برخی از این قراردادها و قوانین از نظر شخصی ما یا محققین دیگر باشد. شما می توانید با تحقیق، قوانین خودتان را در نظر بگیرید. به طور مثال اگر دوست دارید در نامگذاری متغیرها بر خلاف گفته ی ما عمل کنید، آزاد هستید و اجباری نیست.
قراردادها و قوانین برنامه نویسی معمولا سه حیطه را در بر میگیرند:
از مزایای رعایت این قراردادها می توان به خواناتر شدن کدها و مدیریت ساده تر آن ها اشاره کرد.
اگر از ابتدای دوره دقت کرده باشید متوجه خواهید شد که نامگذاری متغیرها را به صورت camelCase انجام داده ایم. camelCase (به معنی «شتری») قرارداد نامگذاری است که می گوید تمام حروف اول در هر کلمه باید بزرگ باشند به جز کلمه ی اول. دلیل نامگذاری آن این است که نوشتن با این قرارداد کلمه را به کوهان یک شتر شبیه می کند.
در نامگذاری متغیرها ما به این صورت عمل کرده ایم:
به مثال زیر توجه کنید:
firstName = "John"; lastName = "Doe"; price = 19.90; tax = 0.20; fullPrice = price + (price * tax);
اگر در مثال بالا firstName را به صورت FirstName یا FIRSTNAME یا firstname مینوشتیم دیگر پیرو قانون camelCase نبودیم.
همیشه اطراف اپراتورها ( = + - * / ) و بعد از ویرگول ها space قرار دهید:
var x = y + z; var values = ["Volvo", "Saab", "Fiat"];
همیشه برای فرورفتگی بلوکه های کد از 2 عدد space استفاده کنید:
function toCelsius(fahrenheit) { return (5 / 9) * (fahrenheit - 32); }
بسیاری از برنامه نویسان از Tab به جای space استفاده می کنند. شما می توانید این تصمیم را بر اساس ادیتور خود بگیرید چرا که بعضی از ادیتور ها ممکن است Tab را به شکل های مختلفی تعبیر کنند.
قانون اول: همیشه statement های ساده را با نقطه ویرگول تمام کنید. مثال:
var values = ["Volvo", "Saab", "Fiat"]; var person = { firstName: "John", lastName: "Doe", age: 50, eyeColor: "blue" };
برای statement های پیچیده:
مثال های زیر را ببینید:
توابع
function toCelsius(fahrenheit) { return (5 / 9) * (fahrenheit - 32); }
حلقه ها
for (i = 0; i < 5; i++) { x += i; }
شرط ها
if (time < 20) { greeting = "Good day"; } else { greeting = "Good evening"; }
به مثال زیر توجه کنید:
var person = { firstName: "John", lastName: "Doe", age: 50, eyeColor: "blue" };
اشیاء کوچک را می توان در یک خط نیز نوشت:
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
برای خواناتر شدن کدهایتان بهتر است خط هایتان بیشتر از 80 کاراکتر نداشته باشند. به طور مثال اگر دستورات جاوا اسکریپت شما در یک خط جا نمی شوند می توانید آن ها را بشکنید:
<!DOCTYPE html> <html> <body> <h2>My Web Page</h2> <p>The best place to break a code line is after an operator or a comma.</p> <p id="demo"></p> <script> document.getElementById("demo").innerHTML = "Hello Dolly."; </script> </body> </html>
می بینید که کد جاوا اسکریپت از قسمت = innerHTML شکسته شده است. این شکستگی در اجرای کد مشکلی ایجاد نمی کند.
امیدوارم از این قسمت لذت برده باشید. لازم است باز هم گوشزد کنم که رعایت برخی از این موارد اجباری و برخی دیگر دل بخواهی است. شما می توانید قوانین مربوط به خودتان را داشته باشید و بر اساس آن ها کد نویسی کنید اما هر قانونی را انتخاب کردید باید تا آخر بر اساس همان کار کنید تا کدهایتان به هم ریخته نشوند.
در جلسات قبل توضیح دادیم که در دنیای برنامه نویسی می توان یک کد را به چندین شکل مختلف نوشت (از نظر syntax) و این مسئله باعث ایجاد بی نظمی هایی شده است. محققین و شرکت های بزرگ همواره سعی کرده اند تا یک استاندارد برنامه نویسی را ارائه دهند تا تمام برنامه نویسان بر اساس آن کدنویسی کنند. خوشبختانه این تلاش ها تا حد زیادی موفق بوده و اکثر برنامه نویسان با استاندارد های یکسان یا شبیه به هم برنامه نویسی می کنند. قصد داریم در این قسمت با قراردادها و قوانین بیشتری آشنا شویم.
سعی کنید در تمام کدهایتان از یک قرارداد کدنویسی خاص استفاده کنید و در نیمه ی راه آن را تغییر ندهید. به طور مثال:
موارد بالا تنها مثال هایی بود که بین برنامه نویسان شایع است و شما ملزم به رعایت آن ها نیستید. موضوع مهم، انتخاب یک قرارداد و وفاداری به آن است.
سوال: آیا می توان از hyphen (علامت خط فاصله -) یا Underline (علامت آندرلاین _) استفاده کرد؟
پاسخ: بستگی دارد این سوال را در چه زمینه ای بپرسید. به طور مثال در HTML خصوصیت (attribute) هایی داریم که با -data شروع می شوند و در CSS نیز خصوصیاتی مثل font-size داریم. هر دوی این موارد از خط فاصله استفاده می کنند بنابراین مشکلی در آن ها نداریم اما در جاوا اسکریپت استفاده از خط تیره در نام ها مجاز نیست چرا که ممکن است باعث عملیات تفریق شود.
در مورد آندرلاین ها نیز مشاهده شده است که در زبان SQL رایج است به جای استفاده از camelCase از آندرلاین استفاده شود. همچنین در documentation مربوط به زبان PHP از قرارداد آندلاین استفاده شده است. این مورد به نظر خودتان بستگی دارد.
قرارداد PascalCase معمولا محبوب برنامه نویسان C است و در دنیای وب استفاده ی کمی دارد. تفاوت PascalCase با camelCase در این دو مثال مشخص می شود:
بر اساس PascalCase اینطور می نویسیم: DateOfBirth
بر اساس camelCase اینطور می نویسیم: dateOfBirth (تفاوت در حرف اول)
جاوا اسکریپت و تقریبا تمام کتابخانه های آن (مانند jQuery) از استاندارد camelCase استفاده می کنند.
هشدار: هیچ گاه در زبان جاوا اسکریپت از $ برای نام متغیرها استفاده نکنید چرا که با برخی از کتابخانه های جاوا اسکریپت تضاد دارد.
یکی از عوارض استفاده از نامگذاری شلخته برای عناصر HTML در حالت زیر نمودار می شود:
var obj = getElementById("Demo") var obj = getElementById("demo")
دو دستور زیر یکی نیستند و عناصر متفاوتی را انتخاب می کنند! به همین دلیل پیشنهاد می کنیم که در HTML از قراردادهای نامگذاری استفاده کنید که در جاوا اسکریپت نیز استفاده می کنید.
اکثر وب سرورها (مانند Apache و Unix) به کوچک و بزرگ بودن حروف حساس هستند. این بدان معنی است که تصویر london.jpg را نمی توانید از طریق London.jpg دریافت کنید. وب سرورهای دیگر مانند Microsoft و IIS به کوچکی و بزرگی حروف حساس نیستند بنابراین london.jpg را می توانید از طریق London.jpg یا london.jpg بگیرید. به دلیل این تفاوت ها باید چند نکته را رعایت کنید:
بنابراین بهترین توصیه این است که در وب سرورها همیشه از حروف کوچک استفاده کنید.
تا حد امکان از متغیرهای سراسری استفاده نکنید (این قانون شامل تمام انواع داده ها، اشیاء و توابع است) چرا که ممکن است متغیرها و توابع سراسری توسط اسکریپت های دیگر overwrite شوند.
همچنین بهتر است تمام متغیرهایی که در توابع تعریف می شوند به صورت local (محلی) باشند. متغیرهای محلی تنها می توانند با کلیدواژه ی var
تعریف شوند، در غیر این صورت سراسری خواهند شد.
از روش های بسیار خوب کدنویسی این است که متغیرهایتان را در بالای کدها declare کنید. مزیت های این روش عبارت اند از:
مثال:
// Declare at the beginning var firstName, lastName, price, discount, fullPrice; // Use later firstName = "John"; lastName = "Doe"; price = 19.90; discount = 0.10; fullPrice = price * 100 / discount;
نکته: بهتر است پس از declare کردن متغیرها، همانجا آن ها را مقدار دهی (initialize) کنید. چرا که از خطر برخورد با متغیرهای تعریف نشده دوری می کنید و کدهایتان نیز خواناتر می شوند.
به مثال زیر توجه بفرمایید:
// Declare and initiate at the beginning var firstName = "", lastName = "", price = 0, discount = 0, fullPrice = 0, myArray = [], myObject = {};
از جلسات قبل یادتان می آید که تفاوت declare و initialize چه بود؟
var firstName
مثالی از declaration است.
"" = var firstName
مثالی از initialization است.
هیچ گاه متغیرهای عادی را به صورت شیء تعریف نکنید:
var x = "John"; var y = new String("John");
در کد بالا، خط اول صحیح است. خط دوم با اینکه صحیح است اما مشکلاتی برایتان ایجاد می کند. به طور مثال:
var x = "John"; var y = new String("John"); (x === y)
خروجی این مقایسه false خواهد بود چرا که یکی رشته و دیگری شیء است. حتی می توان گفت:
var x = new String("John"); var y = new String("John"); (x == y)
خروجی این مقایسه نیز False خواهد بود چرا که در جاوا اسکریپت اجازه ی مقایسه کردن اشیاء را ندارید.
بنابراین:
()new Object
از {}
استفاده کنید.()new String
از ""
استفاده کنید.()new Number
از 0
استفاده کنید.()new Boolean
از false
استفاده کنید.()new Array
از []
استفاده کنید.()new RegExp
از /()/
استفاده کنید.()new Function
از {}()
function
در switch های خود از default
استفاده کنید. مثال:
switch (new Date().getDay()) { case 0: day = "Sunday"; break; case 1: day = "Monday"; break; case 2: day = "Tuesday"; break; case 3: day = "Wednesday"; break; case 4: day = "Thursday"; break; case 5: day = "Friday"; break; case 6: day = "Saturday"; break; default: day = "Unknown"; }
همچنین بهتر است در توابع خود به undefined مقدار دهید چرا که اگر کد تابع شما به undefined برخورد کند تمام برنامه متوقف می شود. مثال:
function myFunction(x, y) { if (y === undefined) { y = 0; } }
در ECMAScript 2015 می توانید مقادیر پیش فرض را در خود آرگومان ها تعریف کنید:
function (a=1, b=1) { // function code }
امیدوارم از این قسمت لذت برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.