راهنمای سریع جاوا اسکریپت

JavaScript

سلام،

امروزه با توجه به استفاده گسترده از زبان جاوا اسکریپت (JavaScript)، دانستن آن برای هر توسعه دهنده وبی لازم است. این مقاله در یک نگاه و به طور خلاصه زبان جاوا اسکریپت و مفاهیم وی را معرفی کرده و در ادامه نحوه نگارش (Syntax) کدهای آن را آموزش می دهد. همچنین برای درک بیشتر دستورات جاوا اسکریپت نمونه کدهایی در بین بخش‌های مختلف ارائه شده است.

مقدمه

جاوااسکریپت زبانی است که توسط NetScape تولید شده است. هدف از این زبان پویانمایی اشیا داخل صفحات HTML می باشد. جاوا اسکریپت کاملا با زبان برنامه نویسی جاوا فرق دارد. اگر چه ساختار این زبان به سی پلاس پلاس و جاوا شباهت دارد؛ که این امر برای سهولت یادگیری در نظر گرفته شده است. از همینرو دستورهای متداول مانند if, for, try..catch و … در این زبان هم یافت می‌گردند.
کاربرد گسترده این زبان در سایتها و صفحات اینترنی می‌باشد و به کمک این زبان می‌توان به اشیاء داخل صفحات HTML دسترسی پیدا کرد و آنها را تغییر داد. به همین علت برای پویا نمایی در سمت کاربر، از این زبان استفاده می‌شود.

نحوه نگارش مستقیم کدهای جاوا اسکریپت در HTML

کدهای جاوا اسکریپت در صفحات HTML داخل تگ script قرار می گیرند. از خصیصه type برای مشخص کردن زبان اسکریپت نوشه شده استفاه می شود. <script type="text/javascript"> محل شروع کدهای جاوا اسکرپیت و </script> محل پایان کدهای جاوا اسکریپت را مشخص می کنند. مانند:

<html>
<body>
<script type="text/javascript">
document.write("Hello World!");
</script>
</body>
</html>

خروجی کد بالا نوشته‌ی !Hello World می باشد.

اسکریپت خارجی

گاهی اوقات شما نیاز به اجرای یک کد جاوا اسکریپت در صفحات مختلف (بدون نگارش در تک تک صفحات) دارید. و یا کد شما بسیار طولانی است و هنگام کد نویسی در صفحه html شما را دچار مشکل می کند. در این صورت با استفاده از اسکریپت خارجی مشکل شما حل می شود. برای نگارش اسکریپت خارجی ابتدا یک فایل با فرمت js. ایجاد کنید. می توانید پسوند یک فایل txt را به js. تغییر دهید. سپس این فایل را توسط یک ویرایشگر متن مانند Notepad باز کنید. کدهای جاوا اسکریپت خود را بدون تگ <script> در آن قرار دهید و سپس فایل را ذخیره کنید (با پسوند js.)
برای فراخوانی اسکریپت خارجی از خصیصه src تگ <script> استفاده کنید. مانند زیر که xxx.js آدرس فایل جاوا اسکریپت است:

<html>
<head>
<script type="text/javascript">
<script src="xxx.js"></script>
</script>
</head>
<body>
</body>
</html>

سمی‌کالن (;)، فضاهای سفید و حساس به حروف (Case Sensitive)

در جاوا اسکریپت دستورات اجرایی با سمی‌کالن (Semicolon) یا همان ; از هم جدا می شوند. با وجود اینکه استفاده از سمی‌کولن، در صورتی که دستورات در خطوط جداگانه نوشته شده باشند، اختیاریست، نوشتن آن بسیار توصیه می شود. بد نیست مطلب «معاهده‌های کدنویسی» را مطالعه کنید.
فضاها سفید در جاوا اسکرپیت مانند اغلب زبان‌های برنامه نویسی هنگام اجرا در نظر گرفته نمی شوند. مگر اینکه مقدار یک متغیر رشته ای (String) باشند.
زبان جاوا اسکریپت به کوچکی و بزرگی حروف حساس می باشد. به عنوان مثال bgColor با bgcolor برای نیست.

توضیحات (Comments)

توضیحات می توانند به صورت تک خطی و یا چند خطی باشند. مانند:

// این یک توضیح یک خطی است!

/*
این یک توضیح
چند خطی است.
*/

متغیرها (Variables)

برای تعریف متغیر کافیست نام دلخواه خود را بنویسید. استفاده از کلمه var قبل از نام متغیر اختیاری است، مگر در موارد زیر:

  • زمانی که نام یک متغیر محلی در داخل یک تابع با نام یک متغیر سراسری (Global) یکی باشد، متغیر محلی باید با var تعریف شود. در این مواقع شما در داخل تابع خود دسترسی به متغیر سراسری ندارید. هم چنین متغیرهای محلی فقط در داخل خود تابع قابل دستیابی می باشند.
  • در توابع بازگشتی استفاده از var الزامیست.

نمونه تعریف متغیر در جاوا اسکریپت

x = 42
var x = 42

انواع داده‌ها در جاوا اسکریپت

شما می تواند داده‌هایی از نوع زیر را در جاوا اسکریپ تعریف کنید:

  • شی (Object)
  • تابع (Function)
  • رشته (String)
  • عدد (Number)
  • نوع داده منطقی (Boolean)

در صورتی که متغییری تعریف نشده باشد، نوع آن متغیر undefined است. برای دستیابی به نوع یک متغیر می توانید از تابع typeof استفاده کنید. در زیر نمونه تعریف متغیرها و استفاده از تابع typeof را مشاهده می کنید:

var aDate = new Date()
var aPowerFunc = new Function("x", "return x * x")
var aString = "I am a string"
var aNumber = 42
var aBoolean = true

alert(typeof aPowerFunc); // typeof aPowerFunc is object
alert(typeof aDate); // typeof aDate is object
alert(typeof aString); // typeof aString is string
alert(typeof aNumber); // typeof aNumber is number
alert(typeof aBoolean); // typeof aBoolean is boolean
alert(typeof nonExistVar); // typeof nonExistVar is undefined
alert(typeof Date); // typeof Date is function. predefined object Date

آرایه ها (Arrays)

روش‌های مختلفی برای تعریف آرایه در جاوا اسکریپت وجود دارد. در زیر نمونه‌هایی از تعریف آرایه‌ها ارائه شده است:

beans = ["Java beans","Coffee beans","Cacao beans"];
myCars = new Array("Jaguar", "Mercedes", "Rolls Royce");
noOfEntries = myCars.length; // طول آرایه
myCD = new Array(42) // تعریف آرایه ای به نام myCD با 42 عضو
myCD[0] = "Queen" //اولین عنصر آرایه
myCD[1] = "Carlos Santana"
myCD[2] = "Mozart"
myCD[3] = "Chopin"
...
myCD[41] = "Shubidua" //آخرین عنصر آرایه
// تعریف آرایه با کلیدهای مشخص - Associative Array ویا همان Property Maps
assoarr = {color1: "green", color2: "yellow", color3: "white"};

اشیا (Objects)

تعریف یک شی مانند تعریف یک تابع می باشد. مانند:

function objDef(name) {
this.objvar = name
}
// creation of an instance of the above defined object "class" myObj = new objDef("Saeid")

متدها و خصوصیات (Methods, Properties)

متد همان تابع تعریف شده در یک شی و خصیصه، مقادیر متغیرهای آن می‌باشد. مانند:

//Property
//objectName.propertyName = value
//Method
//objectName.methodName = function

function calcArea(radius) {
return(radius * radius * Math.PI);
}

function circle(color, radius) {
this.fillColor = color;
this.area = calcArea(radius);
}

var myCircle = new circle('green', 2);
alert(myCircle.fillColor);
alert(myCircle.area);

عملگرها در جاوا اسکریپت

در زیر عملگرها بر اساس نوع عملیات و داده مورد استفاده دسته‌بندی شده‌اند.

انواع عملگرها برای اعداد
عملگرتوضیحات
+جمع
-تفریق
++افزایش مقدار متغییر به اندازه یک واحد
کاهش مقدار متغییر به اندازه یک واحد
*ضرب
/تقسیم
%باقیمانده
انواع عملگرها برای رشته‌ها
عملگرتوضیحات
+الحاق دو یا چند رشته
+=الحاق محتوای یک رشته با یک یا چند رشته و اختصاص دادن مقدار به رشته اول
انواع عملگرهای منظقی
عملگرتوضیحات
&&و (AND)
||یا (OR)
!خِلاف (NOT)
==مساوی با (equal)
!=نامساوی با (not equal)
===دقیقا مساوی با (از نظر مقدار و نوع داده)
!==نامساوی با (از نظر ارزش) ویا نامساوی (از نظر نوع)
>بزرگتر از
>=بزرگتر از ویا مساوی با (بزرگترمساوی)
<کوچکتر
<=کوچکتر از ویا مساوی با (کوچکتر مساوی)
انواع عملگرها برای تخصیص
عملگرتوضیحات
=اختصاص دادن یک مقدار به متغیر
+=الحاق محتوای متغیر سمت چپ عملگر با یک متغیر و اختصاص دادن مقدار به متغیر سمت چپ
-=تفریق یک متغیر از متغیر سمت چپ عملگر و اختصاص دادن مقدار بدست آمده به متغیر سمت چپ
*=ضرب یک متغیر در متغیر سمت چپ عملگر و اختصاص دادن مقدار بدست آمده به متغیر سمت چپ
/=تقسیم متغیر سمت چپ عملگر و اختصاص دادن مقدار بدست آمده به متغیر سمت چپ
%=تقسیم متغیر سمت چپ عملگر و اختصاص دادن باقیمانده تقسیم به متغیر سمت چپ
سایر عملگرها
عملگرتوضیحات
newایجاد یک شی
deleteحذف یک شی
thisاشاره به شی جاری
typeofدستیابی به نوع متغیر عملوند
voidارزیابی یک عبارت بودن بازیابی مقدار آن

عبارت‌های شرطی (Conditional Statements)

در زیر نحوه نگارش عبارت‌های شرطی با if و switch ارائه شده است.

عبارت شرطی با if

// if ساده
if (condition) {
 statements
}

// if همراه با else
if (condition) { statements
} else {
statements
}

// if خلاصه یک خطی
condition ?  expr1 :  expr2

عبارت شرطی با switch

switch (expression){ case label:
statement;
  break;
 case label2:
statement;
  break;
 default :  statement;
}

حلقه ها (Loops)

در جاوا اسکریپت امکان نوشتن حلقه ها به چهار صورت امکان پذیر است.

حلقه for

for(var i=0; i < array.length; i++){
 ...
}

حلقه do … while

var i=0; do {
i+=1;
} while (i < 5)

حلقه while

n=8
while( n > 0) {
n--
}

حلقه while

این حلقه بر روی خصوصیات یک شی اعمالی را انجام می دهد:

student1 = new Student("Hans Christian", "Andersen", 1805); for (props in student1) {
  document.write(student1.props)
}

دستور break و continue

مانند سایر زبان‌های برنامه‌نویسی دستور break حلقه را قطع کرده و برنامه را به بعد از حلقه منتقل می‌کند. دستور continue نیز مانند break حلقه جاری را قطع می‌کند و در ادامه دور بعدی حلقه را اجرا می کند. مانند:

while(i > 0){ if(a[i]=="Orange")
break; i--;
}
while(i > 0){
 if(a[i]!="Orange")
  continue;
oranges++;
}

معرفی بعضی از اشیا موجود در جاوا اسکریپت

مهمترین آبجکت‌های جاوا اسکریپت عبارتند از:

Date
Array
Boolean
Function
Math
Number
RegExp
String

در ادامه تعدادی از این اشیا بررسی شده اند.

شی Date

برخی از متدهای شی Date
متدتوضیحات
getDate()بازیابی روز ماه جاری (۱-۳۱)
getDay()بازیابی شماره روز هفته جاری (۰-۶)
getYear()سال جاری دو رقمی بین ۰ تا ۹۹ برای سالهای قبل از ۱۹۹۹ و چهار رقمی برای سال‌های بعد از آن
getFullYear()سال جاری چهار رقمی
getHours()ساعت (۰-۲۳)
getMonth()ماه (۰-۱۱) – این شماره از ماه جاری یک ماه کمتر است.
getSeconds()ثانیه جاری (۰-۵۹)
getTime()تعداد میلی‌ثانی‌های گذشته از تاریخ ۱ ژانویه ۱۹۷۰
setDate(),
setHours(),
. . .
مقداردهی به تاریخ و زمان مورد نظر
parse()دستیابی به زمان طی شده از ۱ ژانویه ۱۹۷۰ تا زمان مورد نظر در واحد میلی‌ثانیه
toString()تبدیل تاریخ به رشته

برای استفاده از شی Date می توانید مانند زیر عمل کنید:

now = new Date // تاریخ جاری
nowDay = now.getDay() // (0-6)
nowHour = now.getHour() // (0-23)

شی Boolean

استفاده از شی Boolean بسیار ساده می باشد. در زیر نمونه تعریف آن آمده است:

x = true; // مقدار منطقی true
y = false; // مقدار منطقی false
z = new Boolean(false); // مقدار این شی false است.
z2 = new Boolean("false"); // مقدار ای شی true است! دقت کنید که هر رشته ای که به شی Boolean پاس شود مقدار ای شی را true می کند.
z3 = new Boolean(true); // مقدار این شی true است.

شی Math

همانطور که از اسم این شی مشخص است، کاربرد آن بیشتر در محاسبات و عبارت‌های ریاضی است.

برخی از متدهای شی Math
متد یا عبارتتوضیحات
absقدرمطلق
sin, cos, tan
acos, asin, atan
توابع مثلثاتی
min, maxبدست آورن کمترین و بیشترین مقدار
roundگردکردن مقدار
sqrtبدست آوردن جذر یک عدد
powتوان. اولین مقدار، پایه توان و دومین مقدار نمای آن می باشد. به عنوان مثال Math.pow(x,y) برابر است با xy
randomایجاد یک عدد رندوم بین صفر و یک.
Math.Eمقدار ثابت عدد e (فرمول اولر یا اویلر) حدود ۲,۷۱۸
Math.PIمقدار ثابت عدد پی. حدود ۳,۱۴۱۵۹

نمونه استفاده از آبجکت Math:

a = Math.PI * r*r; with(Math){
a = PI * r*r;
x = sin(y);
}

شی String

برخی از متدهای شی String
متدتوضیحات
boldمانند تگ <bold> رشته را درشت‌تر می‌کند.
italicsمانند تگ <i> عمل می کند.
concatالحاق ۲ یا چند رشته
charAtدستیابی به کاراکتر از طریق ایندکس (اندیس) آن در رشته
fontcolorمانند تگ <font> به صورت <font color=color> عمل می‌کند.
fontsizeمانند تگ <font> به صورت <font size=size> عمل می‌کند.
indexOfپیدا کردن اولین محل یافت شده از یک رشته در رشته دیگر. در صورتی که این جستجو نتیجه‌ای در بر نداشته باشد، مقدار بازگردانده خواهد شد.
lastIndexOfمانند indexOf با این تفاوت که آخرین محل یافت شده در جستجو را نشان می‌دهد.
lengthطول رشته را نشان می‌دهد.
linkبرای ایجاد لینک مانند تگ <a>
bigمانند تگ <big>
smallمانند تگ <small>
strikeمانند تگ <strike>
subمانند تگ <sub>
substringدستیابی به یک زیررشته از رشته مورد نظر.
toLowerCaseتبدیل رشته به حروف کوچک
toUpperCaseتبدیل رشته به حروف بزرگ
replaceبرای جایگزینه یک رشته در رشته دیگر کاربرد دارد.
splitبرای جداکردن رشته بر اساس یک الگو (جداکننده) کاربرد دارد.

مثال‌هایی از استفاده شی String و متدهای آن در زیر ارائه شده است:

var message = "Simple String";
message[0]; // مقدار "S" باز می‌گرداند.
document.write(message.bold()); // محتوای متغییر را به صورت درشت چاپ می‌کند.
message.charAt(0); // همان message[0] می‌باشد.
message.concat(" enhanced"); // مقدار "Simple String enhanced" را باز می‌گرداند.
message.length; // طول عبارت که همان عدد ۱۳ می باشد را باز می‌گرداند
message.indexOf("Simple"); // عدد ۰ را باز می‌گرداند.
message.lastIndexOf("String"); // عدد ۷ را باز می‌گرداند.
message.substring(2,5); // رشته "mple" را باز می‌گرداند.
document.write(message.replace("Simple", "Complex")); // مقدار "Complex String" را باز می‌گرداند.

رویدادها (Events)

منظور از رویداد، انتفاقی است که در سمت کاربر و براساس فعالیت‌های آن رخ می‌دهد. در زیر تعدادی از رویدادها مهم ارائه شده‌اند. دقت نمایید که فراخوانی آن‌ها در تگ‌های خاصی امکان پذیر است. به عنوان مثال رویداد onSubmit در تگ >form< فراخوانده می‌شود.

تعدادی از رویدادهای مهم در جاوا اسکریپت
رویدادزمان رخ دادن و فراخوانی
onSubmitهنگام ثبت شدن فرم
onResetهنگام زدن دکمه reset فرم
onChangeهنگام تغییر یک مقدار
onSelectهنگام انتخاب یک متن در تگ <input> یا <textarea>
onBlurهنگام خارج شدن از فوکوس یک فیلد
onFocusهنگام فوکوس (انتخاب) یک فیلد
onKeydownهنگام فشردن یک کلید به پایین
onKeyupبعد از فشردن و رها کردن یک کلید
onKeypressهنگام فشردن یک کلید (مجموع onKeydown و onKeyup)
onMouseoverزمانی که نشانگر ماوس بر روی منطقه تگ مورد نظر می رود.
onMouseoutهنگامی که نشانگر ماوس از منطقه تگ مورد نظر خارج می شود.
onMousemoveهنگام حرکت دادن نشانگر ماوس در یک منطقه
onClickهنگام کلیک کردن
onDblclickهنگام دابل کلیک کردن
onLoadهنگام بارگزاری صفحه
onUnloadهنگام بستن صفحه مورد نظر
onResizeهنگام تغییر دادن سایز صفحه (پنچره) مورد نظر
onErrorهنگام رخ دادن یک خطا جاوا اسکریپتی

پی‌نوشت

همانطور که در ابتدای مقاله گفته شد این مقاله فقط به طور کلی جاوا اسکریپت و دستورات آن را معرفی کرده است. در صورتی که علاقمند به آشنایی بیشتر و دقیق‌تر این زبان هستید، می توانید به منابع معرفی شده در انتهای همین مطلب مراجعه نمایید.

منابع

شاد و پیروز باشید :)

معاهده‌های کدنویسی (Coding conventions)

برنامه نویس کامپیوتر

سلام،

معاهده‌های کدنویسی (Coding conventions) به مجموعه استانداردها و روش‌های کدنویسی یک زبان برنامه نویسی گفته می شود که معمولا توسط توسعه دهنده آن زبان معرفی می شود. این مقاله به معرفی مهم ترین معاهده‌های برنامه نویسی می پردازد. در انتها فهرستی از معاهده‌های کدنویسی مهم‌ترین زبان‌های برنامه‌نویسی ارائه شده است.

مقدمه

به مجموعه استانداردها و روش‌های کدنویسی توسط یک زبان برنامه نویسی، معاهده‌های کدنویسی این زبان گفته می‌شود. این معاهده‌ها دربرگیرنده راهنماهایی در زمینه ساختار فایل، فاصله‌ها، توضیحات، تعاریف، عبارات، فضاهای خالی، نامگذاری و… می باشند. معمولا توسعه دهنده یک زبان برنامه نویسی این معاهده‌ها را ارائه می کند. البته تیم‌ها، شرکت‌ها و سازمان‌ها نیز ممکن است استاندارد‌های خاص خود را به همراه این معاهده‌ها به برنامه نویسان خود ابلاغ نمایند.
برنامه‌نویسان و توسعه دهندگان نرم‌افزارها استفاده از این استانداردها را بسیار توصیه می کنند. استفاده از معاهده‌ها علاوه بر افزایش خوانایی کدهای برنامه، نگهداری (Maintenance) نرم‌افزار را نیز آسان‌تر می کند. این نکته را در نظر داشته باشید که استفاده از معاهده‌ها اجباری نبوده و در صورت عدم استفاده از آن‌ها به خطای کامپایلر برخورد نمی‌نمایید.

نگهداری نرم‌افزار

کم‌کردن هزینه نگهداری نرم‌افزار (Software Maintenance) مهم‌ترین دلیل پیروی از معاهده‌های برنامه نویسی است. شرکت سان مایکروسیستمز در معرفی معاهده‌های کدنویسی زبان جاوا چهار عامل زیر را دلیل ارائه معاهده‌های کدنویسی معرفی کرده است:

  1. ۸۰٪ از هزینه طول عمر یک نرم‌افزار صرف تعمیر و نگهداری آن می شود.
  2. معمولا برنامه‌نویس نرم‌افزار در طول عمر نرم‌افزار عوض شده و ثابت باقی نمی‌ماند.
  3. معاهده‌های کدنویسی با افزایش خوانایی کدهای برنامه به مهندسان این امکان را می‌دهند که کد‌های جدید را سریع‌تر و کامل‌تر درک کنند.
  4. در صورتی که شما کد منبع خود را به عنوان یک محصول عرضه می‌نمایید، باید از صحیح، مرتب و یکسان بود کد‌های خود در محصولات مختلف‌تان مطمئن باشید.

کیفیت

در فرایند توسعه نرم‌افزار مرحله‌ای با عنوان ارزشیابی همتایان (Peer review) وجود دارد که در طی آن شخص انجام دهنده یک کار، تکلیف صورت گرفته را همراه با یک یا چند تن از همکاران خود ارزیابی می کند. هدف از این مرحله بررسی منظم محصول به منظور یافتن مشکلات احتمالی و رفع ایراد آن‌ها می‌باشد. نام انگلیسی این مرحله (Software peer review) است.
Software peer review غالبا به بررسی کدها منبع می‌پردازد. در صورتی که کد منبع از معاهده‌های زبان مورد نظر پیروی کرده باشد، علاوه بر افزایش کیفیت کد منبع موجب می شود تا مشاهده، بررسی و رفع ایرادات برای تیم ارزشیابی بسیار آسان‌تر شود.
با انجام صحیح ارزشیابی همتایان، بسیاری از مشکلات احتمالی حال و آینده رفع خواهد شد. به عنوان مثال در صورت مراجعه مجدد به کدمنبع در آینده فهمیدن و درک کدی که درست ارزشیابی شده و از معاهده‌ها پیروی کرده است راحت‌تر بوده و زمان کمتری را نیاز خواهد داشت.

تغییر در ساختار کد (Refactoring)

منظور از refactoring فعالیتی است که طی آن خوانایی کدمنبع افزایش یافته و ساختار وی بهبود می یابد. به طور کلی هر تغییری در کدمنبع که رفتار یک نرم‌افزار را تغییر ندهد می تواند به عنوان refactoring در نظر گرفته شود. برخی از این تغییرات عبارتند از: تغییر نام متغییرها، تغییر نام متدها و توابع، عوض کردن محل قرارگیری یک متد (یا کل کلاس) و شکستن یک متد یا تابع بزرگ به متدها یا توابع کوچک‌تر.
refactoring در برنامه نویسی یک نرم‌افزار به صورت تیمی، در مراحل ابتدایی کدنویسی انجام می شود. هدف از این کار یکسان کردن استانداردها و ساختار کدهای نوشته شده توسط اعضای تیم است. انتظار می رود که بعد از این مرحله اعضای تیم بیشتر معاهده‌ها و استانداردها را فراگرفته و از آن‌ها پیروی نمایند.

اتوماسیون وظایف (Task automation)

معاهده‌های کدنویسی این امکان را فراهم می کنند تا فرایندهایی غیر از کامپایل و اجرای نرم‌افزارها را به آسانی انجام داد. از جمله مهم‌ترین این فرایندها می توان به ساخت و انتشار خودکار مستندات برنامه اشاره کرد. به عنوان مثال شما می توانید با نوشتن برچسب‌های author، version، param و… در توضیحات کدمنبع به صورت خودکار مستندات فنی نرم‌افزار خود را ایجاد کنید. به کد جاوای زیر توجه کنید:

/**
 * Simple calculator operation.
 * @author <a href="mailto:me@my.com">Me</a>
 * @version 1.0
 */
public interface Operation {
    /**
     * Perform a single calculation.
     * @param operand the operand to use for calculation.
     */
    public void calculate(double operand);

    /**
     * Get the current result.
     * @return the current result. If no calculations were
     *         performed the result is undefined.
     */
    public double getResult();
}

تصویر زیر خروجی HTML تولید شده با نرم‌افزار Javadoc را نشان می دهد:

خروجی HTML تولید شده با نرم‌افزار Javadoc

برخی از معاهده‌های کدنویسی مهمترین زبان‌های برنامه نویسی

در زیر پیوندهایی به تعدادی از معاهده‌های کدنویسی ارائه شده است:

منابع

منبع تصویر: onlinedegrees.org

شاد و پیروز باشید :)

انواع داده در MySQL

MySQL

سلام،
هدف این مقاله بررسی انواع داده ها در پایگاه داده MySQL (مای‌اس‌کیوال) می باشد. MySQL انواع مختلف داده را در دسته بندی های زیر پشتیبانی می کند:

  • اعداد (Numeric)
  • زمان (Date and Time)
  • رشته ها (String)
  • داده های فضایی (Spatial)

در این مقاله داده های عددی، زمان و رشته ها را بررسی می کنیم. با توجه به تخصصی بودن داده های فضایی، این نوع داده ها را در مقاله ای جداگانه در آینده بررسی خواهیم کردم.

اعداد (Numeric)

MySQL تمامی انواع داده های عددی استاندارد SQL شامل اعداد صحیح و اعداد تقریبی را پشتبانی می کند. هر یک از نوع داده های عددی حافظه مشخصی برای ذخیره سازی نیاز دارند. همچنین در نظر داشته باشید که هر کدام از آنها محدوده مشخصی را پشتیبانی می کنند. هر نوع از این داده های عددی را می توان به صورت SIGNED یا UNSIGNED تعریف کرد. در حالت SIGNED این ستون ها از مقادیر منفی پشتبیبانی می کنند ولی در حالت UNSIGNED اعداد ذخیره شده باید بزرگتر ویا مساوی صفر باشند. در نظر داشته باشید که نوع داده BOOLEAN برای ذخیره مقادیر TRUE و FALSE همان TINYINT(1) می باشد.
جدول زیر اطلاعات کلی نوع داده های عددی را در حالت SIGNED و UNSIGNED نشان می دهد:

اطلاعات کلی نوع داده های عددی Integer
نوعحافظه (بایت) حداقل مقدار حداکثر مقدار توضیحات
TINYINT1-128127
0255
SMALLINT2-3276832767
065535
MEDIUMINT3-83886088388607
016777215
INTEGER4-21474836482147483647
04294967295
BIGINT8-92233720368547758089223372036854775807
018446744073709551615
اطلاعات کلی نوع داده های عددی شناور
نوعحافظه (بایت) مقدار نحوه تعریف توضیحات
FLOAT4از ۰ تا ۲۳ رقمFLOAT(M,D)مقدار تقریبی (Approximate Value)
DOUBLE8از ۲۴ تا ۵۳ رقمDOUBLE(M,D)مقدار تقریبی (Approximate Value)
DECIMALهر ۹ رقم ۴ بایت به صورت باینریتا ۶۵ رقمDECIMAL(M,D)مقدار دقیق (Exact Value)

در جدول بالا حرف M نشان‌دهنده تعداد کل رقم‌های داده و حرف D نشان‌دهنده تعداد رقم‌های بعد از ممیز (.) می باشد. به عنوان مثال در ستونی که به صورت FLOAT(7,4) تعریف شده است می توان حداکثر مقدار 999.9999 را ذخیره نمود. در صورتی که شما عدد 999.00009 را به این جدول وارد کنید، عدد واردشده به صورت 999.0001 ذخیره خواهد شد.

سوال: منظور از مقدار تقریبی و دقیق در جدول داده های عددی شناور چیست؟
پاسخ: گاهی اوقات در نوع داده‌های تقریبی اعداد گرد می شوند. در زیر با اجرا کردن چند دستور در خط فرمان MySQL پایگاه داده‌ای با دو ستون Decimal و Float تعریف کردیم. در آخرین دستور نتیجه گردشدن را در ستون Float مشاهده می فرمایید:

mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G
*************************** 1. row ***************************
@a := (a/3): 33.333333333
@b := (b/3): 33.3333333333333
     @a * 3: 99.999999999
     @b * 3: 100

برای اطلاعات بیشتر به صفحه Problems with Floating-Point Values در سایت MySQL مراجعه نمایید.
در نسخه های قبل از 5.0.3 نوع داده DECIMAL به صورت String ذخیره می شود و مقدار رقم‌هایی که پشتیبانی می کرد مانند نوع داده DOUBLE بود.

نوع داده BIT

این نوع داده برای ذخیره بیت‌های ۰ و ۱ استفاده می شود. برای تعریف ستونی از این نوع از عبارت BIT(M) استفاده می کنیم که در اینجا M فضایی به طول تقریبا (M+7)/8 بایت را برای نگهداری داده‌ها ایجاد می کند. M می تواند عددی از ۱ تا ۶۴ باشد. برای نشان‌دادن ۰ و ۱ به صورت بیت از حرف b استفاده می کنیم. به عنوان مثال b'111' و b'10000000' که به ترتیب برابر اعداد ۷ و ۱۲۸ می باشند. برای درک بیشتر این موضوع به دستورات و نتایج زیر در خط فرمان MySQL توجه فرمایید:

mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
mysql> INSERT INTO t SET b = b'0101';
mysql> SELECT b+0, BIN(b+0), OCT(b+0), HEX(b+0) FROM t;
+------+----------+----------+----------+
| b+0  | BIN(b+0) | OCT(b+0) | HEX(b+0) |
+------+----------+----------+----------+
|  255 | 11111111 | 377      | FF       |
|   10 | 1010     | 12       | A        |
|    5 | 101      | 5        | 5        |
+------+----------+----------+----------+
3 rows in set (0.03 sec)

آخرین Query در بالا توابع مختلف برای تبدیل این اعداد را نشان می دهد. عبارت +0 مقدار دودویی ذخیره شده را به عدد ده‌دهی متناظر تبدیل می کند.

زمان (Date and Time)

در کل ۵ نوع داده برای ذخیره زمان (ساعت و تاریخ) داریم. در جدول زیر اطلاعات این نوع داده‌ها را مشاهده می‌فرمایید:

اطلاعات کلی نوع داده های زمانی (Date and Time)
نوعحافظه (بایت) مقدار صفر (“Zero” Value)
DATE3'0000-00-00'
TIME3'00:00:00'
DATETIME8'0000-00-00 00:00:00'
TIMESTAMP4'0000-00-00 00:00:00'
YEAR10000

در ادامه به بررسی نوع داده‌های ذکر شده در بالا خواهیم پرداخت.

نوع داده DATE

این نوع داده فقط برای ذخیره سازی تاریخ استفاده می شود. فرمت پیش فرض این نوع داده 'YYYY-MM-DD' است. بازه‌ای که توسط DATE پشتیبانی می شود از '1000-01-01' تا '9999-12-31' می باشد.

نوع داده TIME

این نوع داده برای ذخیره سازی زمان (ساعت، دقیقه، ثانیه) استفاده می شود. فرمت پیش‌فرض این نوع داده 'HH:MM:SS' و یا 'HHH:MM:SS' است. بازه ای که در نوع TIME پشتیبانی می شود از '-838:59:59' تا '838:59:59' می باشد. نوع داده TIME فقط برای نمایش زمان روز استفاده نمی شود. برای نمایش تفاوت زمانی دو بازه و یا زمان باقی‌مانده نیز می تواند از TIME استفاده نمود. به همین دلیل بازه پشتیبانی شده بیشتر از ۲۴ ساعت و یا کمتر از صفر (منفی) می باشد.
برای استفاده از عبارت های مخفف در نوع داده TIME باید دقت نمایید. به عنوان مثال MySQL عبارت '11:12' را به صورت '11:12:00' تفسیر می کند. در صورتی که داده بدون ':' (دو نقطه) بیان شود، MySQL آن را از سمت راست تفسیر می کند. به عنوان مثال عبارت '1112' و یا 1112 به معنی '00:11:12' است.
به صورت پیش فرض MySQL داده‌های خارج از محدوده TIME را در صورتی که با فرمت مناسب وارد شده باشند به نزدیک‌ترین بازه تبدیل می کند. به عنوان مثال عبارت‌های '-850:00:00' و '850:00:00' به '-838:59:59' و '838:59:59' تبدیل خواهند شد. داده‌هایی که فرمت مناسب نداشته و یا قابل تفسیر برای داده TIME نباشند به عبارت '00:00:00' تبدیل خواهند شد.

نوع داده DATETIME

این نوع داده برای ذخیره سازی زمان به صورت کامل شامل تاریخ و ساعت استفاده می شود. فرمت پیش فرض این نوع داده 'YYYY-MM-DD HH:MM:SS' می باشد. بازه‌ی پشتیبانی DATETIME از '1000-01-01 00:00:00' تا '9999-12-31 23:59:59' است.

نوع داده TIMESTAMP

این نوع داده همانند DATETIME می باشد. بازه‌ای که توسط TIMESTAMP پشتیبانی می‌شود از '1970-01-01 00:00:01' UTC تا '2038-01-19 03:14:07' UTC است.
داده‌های TIMESTAMP هنگام ذخیره شدن از زمان منطقه زمانی (Time Zone) کنونی سیستم به UTC تبدیل و ذخیره می شوند. متناظر با همین امر، هنگام نشان دادن داده‌های TIMESTAMP، ابتدا داده‌ها از UTC به منطقه زمانی کنونی سیستم تبدیل شده و بعد نمایش داده می شوند. به همین علت در صورتی که منطقی زمانی سیستم عوض شود، ممکن است داده‌ها به صورت غیرعادی و یا غلط نمایش داده شوند.
نوع داده TIMESTAMP این قابلیت را دارد که مقداردهی اولیه و یا مقداردهی خودکار داشته باشید. برای مقداردهی اولیه کافیست مقدار پیش فرض فیلد مورد نظر را CURRENT_TIMESTAMP قرار دهید. مانند:

mysql> CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

در حالت مقداردهی خودکار، مقدار ذخیره شده در فیلد TIMESTAMP هنگام بروزرسانی (UPDATE) یک ردیف به زمان بروزرسانی تغییر پیدا می کند. مانند:

mysql> CREATE TABLE t (name VARCHAR(100), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

mysql> INSERT INTO t(name) VALUES('Saeid');

mysql> SELECT * FROM t;
+-------+---------------------+
| name  | ts                  |
+-------+---------------------+
| Saeid | 2011-12-22 12:00:26 |
+-------+---------------------+
1 row in set (0.00 sec)

mysql> UPDATE t SET name = 'Alireza';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM t;
+---------+---------------------+
| name    | ts                  |
+---------+---------------------+
| Alireza | 2011-12-22 12:01:56 |
+---------+---------------------+
1 row in set (0.00 sec)

برای کسب اطلاعات بیشتر به صفحه TIMESTAMP Properties در سایت MySQL مراجعه نمایید.

نوع داده YEAR

این نوع داده برای ذخیره سازی سال با فرمت YYYY به کار می‌رود. شما می تواند سال مورد نظر خود را به صورت دو رقمی YEAR(2) و یا ۴ رقمی YEAR(4) تعریف کنید. نوع YEAR از سال 1901 تا 2155 و 0000 را پشتیبانی می کند. در صورتی که سال را به صورت ۲ رقمی تعریف کرده باشید، اعداد 00 تا 69 در قرن ۲۱ و اعداد 70 تا 99 در قرن ۲۰ در نظر گرفته می شوند. مثلا 45 به عنوان 2045 و 80 به صورت 1980 در نظر گرفته می شود. تمامی مقادیر غیر منطقی برای YEAR به صورت 0000 ذخیره می شوند.

رشته ها (String)

نوع داده String برای نگه داری رشته‌ها (متون) استفاده می شود. در زیر اطلاعات کلی داده هایی از نوع String را مشاهده می فرمایید. در جدول زیر M نشان‌دهنده طول تعریف شده برای داده و L نشان‌دهنده طول واقعی رشته داده شده می باشد.

اطلاعات کلی نوع داده رشته‌ها (String)
نوع مقدارحافظه (بایت)
CHAR(M)0 <= M <= 255 M × w بایت. w تعداد بایت مورد نیاز برای حداکثر طول کاراکترهای تعریف شده در character set جدول می باشد.
BINARY(M)0 <= M <= 255 M بایت
VARCHAR(M)0 <= M <= 65532 L + 1 بایت اگر داده مورد نظر کمتر از ۲۵۵ بایت نیاز داشته باشد.
L + 2 بایت اگر داده مورد نظر بیشتر از ۲۵۵ بایت نیاز داشته باشد.
VARBINARY(M)0 <= M <= 65532 M + 1 بایت اگر داده مورد نظر کمتر از ۲۵۵ بایت نیاز داشته باشد.
M + 2 بایت اگر داده مورد نظر بیشتر از ۲۵۵ بایت نیاز داشته باشد.
TINYBLOBL < 28L + 1 بایت
TINYTEXTL < 28L + 1 بایت
BLOBL < 216L + 2 بایت
TEXTL < 216L + 2 بایت
MEDIUMBLOBL < 224L + 3 بایت
MEDIUMTEXTL < 224L + 3 بایت
LONGBLOBL < 232L + 4 بایت
LONGTEXTL < 232L + 4 بایت
ENUM('v1','v2',...)حداکثر ۶۵,۵۳۵ عضو۱ یا ۲ بایت.
وابسته به مقدار داده.
SET('v1','v2',...)حداکثر ۶۴ عضو۱، ۲، ۳، ۴ یا ۸ بایت
وابسته به مجموعه داده شده.

نوع داده CHAR و VARCHAR

CHAR و VARCHAR بسیار شبیه به هم هستند. مهم‌ترین تفاوتی که بین CHAR و VARCHAR وجود دارد نحوه ذخیره سازی و بازیابی اطلاعات است. هنگام تعریف این نوع داده‌ها شما حداکثر تعداد کاراکتری را که می خواهید ذخیره شود را مشخص می نمایید. به عنوان مثال CHAR(30) برای ذخیره حداکثر ۳۰ کاراکتر تعریف می شود.
طول ستونی که از نوع CHAR باشد ثابت است. در صورتی که طول داده کمتر از طول تعریف شده باشد، فضای باقیمانده با فاصله (space) از راست پر می‌شود. هنگام بازیابی اطلاعات این فضای خالی قبل از نمایش حذف می‌شود مگر اینکه حالت PAD_CHAR_TO_FULL_LENGTH فعال شده باشد.
در نوع داده VARCHAR طول داده ذخیره شده به اندازه مقدار داده وارد شده می باشد. به عنوان مثال اگر ستونی به صورت VARCHAR(100) تعریف شده باشد ولی طول رشته داده شده 50 کاراکتر باشد، فقط به مقدار بایت زیر فضا لازم است.

(50 * فضای لازم برای ذخیره هر کاراکتر) + 2


در صورتی که در تعریف VARCHAR(M) مقدار M بیشتر از ۶۵,۵۳۵ باشد، MySQL به طور خودکار نوع ستون را از VARCHAR به نوع مناسبی مانند MEDIUMTEXT تغییر می دهد.

جدول زیر تفاوت‌های فضای مورد نیاز برای ذخیره اطلاعات را در CHAR و VARCHAR نمایش می دهد. دقت کنید که در جدول زیر Character Set داده مورد نظر تک بایتی مانند latin1 است.

بررسی تفاوت فضای مورد نیاز برای CHAR(4) و VARCHAR(4)
دادهCHAR(4)فضای مورد نیازVARCHAR(4)فضای مورد نیاز
'''    '۴ بایت''۱ بایت
'ab''ab  '۴ بایت'ab'۳ بایت
'abcd''abcd'۴ بایت'abcd'۵ بایت
'abcdefgh''abcd'۴ بایت'abcd'۵ بایت

نوع داده BINARY و VARBINARY

این نوع داده ها مانند CHAR و VARCHAR می باشند فقط با این تفاوت که در این نوع داده‌ها رشته‌های باینری (صفر و یک) ذخیره می شود. در نتیجه Character set برای این نوع داده‌ها معنی ندارد. از طرفی مرتب‌سازی و مقایسه بر اساس مقدار عددی رشته باینری ذخیره شده می باشد.

نوع داده BLOB و TEXT

این نوع داده‌ها مانند BINARY و VARBINARY می باشند. هر کدام از این داده‌ها دارای ۴ نوع می‌باشند که تنها تفاوت آن‌ها در حداکثر طول داده قابل ذخیره شدن است.

نوع داده ENUM

این نوع داده فقط امکان ذخیره سازی رشته ای را می دهد که از مجموعه تعریف شده باشد. این مجموعه هنگام ساخت جدول تعریف می شود. مانند جدول زیر:

CREATE TABLE sizes (
    name ENUM('small', 'medium', 'large')
);

در ستون name در جدول بالا فقط می توانید یکی از مقادیر small، medium یا large را ذخیره نمایید. در صورتی که مقداری خارج از مجموعه وارد مجموعه شود، فضای خالی در name ذخیره می شود، نه مقدار وارد شده.

نوع داده SET

این نوع داده مانند ENUM می باشد، با این تفاوت که شما می توانید چند عضو از مجموعه تعریف شده را انتخاب نمایید. توجه نمایید که یا داده‌های تکراری قبل از ذخیره سازی حذف می شوند. به مثال زیر توجه فرمایید:

mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO myset (col) VALUES  ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT col FROM myset;
+------+
| col  |
+------+
| a,d  |
| a,d  |
| a,d  |
| a,d  |
| a,d  |
+------+
5 rows in set (0.00 sec)

از قراردادن فاصله قبل و یا بعد ',' جدا خوددداری نمایید.

چطور نوع داده مناسب را انتخاب نماییم؟

قبل از هر چیز بازه‌ی مورد نیاز برای داده خود را معین نمایید. سپس مختصرترین نوع داده را برای ستون خود انتخاب نمایید. به عنوان مثال برای بازه اعداد ۰ تا ۹۹۹۹۹ نوع MEDIUMINT UNSIGNED بهترین گزینه است.
مورد دیگر انتخاب نوع ستون مناسب با داده شما است. به عنوان مثال هرگز تاریخ شمسی را در پایگاه داده در ستونی از نوع رشته (مانند CHAR) ذخیره ننمایید. بهترین گزینه تبدیل تاریخ به تاریخ میلای و ذخیره آن در داده‌ای از نوع DATE است.
در هنگام تعریف ستونی برای داده‌های عددی در صورتی که فقط اعداد مثبت را لازم دارید، ستون خود را از نوع UNSIGNED انتخاب نموده و حداقل بازه را انتخاب نمایید. به عنوان مثال اگر ستون عددی شما کلید اصلی و افزایشی خودکار است (PRIMAY KEY and AUTO_INCREMENT) حتما نوع داده خود را UNSIGNED انتخاب نمایید تا حداکثر مقدار کلید اصلی دو برابر شود. نوع INTEGER SIGNED حداکثر عدد 2147483648 (حدود ۲ میلیارد) و INTEGER UNSIGNED حداکثر عدد 4294967295 (حدود ۴ میلیارد) را پشتیبانی می کند.

روش دیگر استفاده از PROCEDURE ANALYSE به منظور دریافت پیشنهاد خود پایگاه داده است. PROCEDURE ANALYSE با توجه به داده‌های فعلی، پیشنهاد خود را برای بهینه کردن نوع داده ارائه می دهد. در نظر داشته باشید که هر چه تعداد داده فعلی شما بیشتر باشد، PROCEDURE ANALYSE پیشنهاد بهتر و دقیق‌تری می دهد. نحوه استفاده از PROCEDURE ANALYSE بسیار ساده است. نحوه نگارش آن به صورت زیر است:

mysql> SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]]);

مانند:

SELECT col1, col2 FROM table1 PROCEDURE ANALYSE(10, 2000);

یا

SELECT * FROM table1 PROCEDURE ANALYSE() \G

اسامی مشابه

در پایگاه داده MySQL برخی از انواع داده‌ها با نام‌های مشابه دیگری نیز قابل دسترسی می باشند. یکی از دلایل این کار پیاده سازی راحت‌تر SQL های پایگاه‌های داده‌ی دیگر است. در زیر این اسامی را مشاهده می نمایید.

اسامی مشابه برای نوع داده‌ها در MySQL
نوع دادهاسم مشابه
INTEGERINT
DECIMALDEC
DECIMALFIXED
DECIMALNUMERIC
DOUBLEREAL
TINYINTBOOLEAN
TINYINTBOOL
VARCHAR(M)CHARACTER VARYING(M)
FLOATFLOAT4
DOUBLEFLOAT8
TINYINTINT1
SMALLINTINT2
MEDIUMINTINT3
INTINT4
BIGINTINT8
MEDIUMBLOBLONG VARBINARY
MEDIUMTEXTLONG VARCHAR
MEDIUMTEXTLONG
MEDIUMINTMIDDLEINT

منابع

شاد و موفق باشید :)

عادت های بد برنامه نویسان

سلام

در طول چند سالی که مشغول به برنامه نویسی هستم عادت های بدی را توسط خودم و بقیه برنامه نویسان مشاهده کرده ام. هدف از این مطلب گردآوری تعدادی از رفتارها و عادت های نادرست است که با شناختن آن ها می توان از رخ دادنشان جلوگیری کرد.

همه بد کد می نویسند، جز من!
گاه اوقات یک برنامه نویس با دیدن کدهای شخص دیگر، به جای قبول کردن اختلاف نظر موجود در کدنویسی به زیر سوال بردن روش کدنویسی طرف مقابل می پردازد. درست است که در پروژه های تیمی رعایت استانداردهای تیم ضروریست، اما در مواردی که شخص در حال کار بر روی جزییات است و هیچ استانداردی را زیر سوال نبرده، بهتر است قبل از بحث در مورد کدهای نوشته شده، دیدگاه وی را در مورد این نوع کدنویسی بدانیم.
Control + Cut + Copy + P
Copy & Paste
یک از بدترین کارهایی که توسط برنامه نویس انجام می شود و علاوه بر خود به کل تیم و پروژه آسیب وارد کند، Copy و Paste کردن کدها بدون بررسی و فراگیری دانش موجود در آنهاست. این مورد بویژه در برنامه نویسان وب بسیار مشاهده می شود. بهتر است به جای کپی کردن کد از جای دیگری، نیاز خود را با فراگیری تکنیک های لازم رفع کنید. در صورتی که مجبور به نسخه برداری از کد دیگری هستید، بهتر است تک تک خطوط آن را بررسی کرده و لایسنس مربوط به آن را رعایت فرمایید. پیشنهاد می کنم صفحه Copy and paste programming در ویکی پدیا را مطالعه کنید.

نام گزاری نامفهوم متغیرها
این مشکل بیشتر در برنامه نویسان کم تجربه دیده می شود. مثلا متغییری را با حرف u تعریف کرده و در بخش های مختلف استفاده می کند. شما فکر می کنید که منظور از u همان user است، بعد شک می کنید که شاید username باشد و در آخر متوجه می شوید که منظور وی usability بوده است! درصورتی که نام متغییر را با توجه به محتوای آن ها برگزیده شود، خوانایی برنامه دوچندان می شود.

این بخش خیلی زود تموم می شود
معمولا زمانی که یک بخش زودتر از موعد مقرر تمام می شود، بهتر است در مورد برنامه نوشته شده شک کنید! شاید برنامه نویس بخواهد با اینکار قدرت برنامه نویسی خود را نشان دهد ولی بارها دیده ام که بعد از چندین هفته و ماه، ایرادی در چنین برنامه ای رخ می دهد که نه تنها زحمات برنامه نویس را از بین می برد، بلکه باعث ضایع شدن شخصیت کاری وی می گردد. شاید اگر از همان اول برنامه نویس مدت زمان بیشتری را صرف نگارش، تست و بازبینی برنامه خود می کرد، ماندگاری برنامه بی نقص وی باعث افزایش اعتبار وی در محیط کاری می شد.

من نبودم! عدم مسئولیت پذیری و عذرخواهی
برخی اوقات بخشی از برنامه دچار ایراد می شود و کسی عهده دار ایراد بوجود آمده نیست. از لحاظ اخلاقی گفتن یک عذرخواهی نه تنها از شخصیت شما نمی کاهد، بلکه نشاندهنده حس مسئولیت پذیری شما می شود. البته با نوشتن توضیحات (Comment) در برنامه می توانید، نویسنده کد را به راحتی بیابید.

سرخوردگی از انجام کارهای تکراری
این مورد بارها برای من اتفاق افتاده است. بدترین بخش کار، انجام دادن مواردی است که هم سطحی هستند، هم حوصله می خواهند و هم از عهده افراد سطح پایین تر و دیگر بر می آیند. اما به هر حال مواردی پیش می آید که مجبور به انجام دادن این قبیل کارها هستید. بهترین راه حل حفظ آرامش و انجام دادن کار در اولین فرصت است. بعید می دانم راه حل دیگری پیدا شود.

انجام دادن ناقص کارها
برخی از برنامه نویس ها، بخصوص کم تجربه تر ها، معنای صحیح اتمام کار را نمی دانند. یعنی انجام دادن کار را به معنی نگارش کد می دانند و مراحل مستندسازی، تست، ادغام کد در پروژه و… را در زمان لازم برای اتمام کار در نظر نمی گیرند. چه بسا پیدا شدن یک خطا در مرحله تست می تواند وی را ساعت ها درگیر کند.

اعمال سلیقه شخصی
منظور از اعمال سلیقه شخصی عدم تفکر در هنگام برنامه نویسی نیست. بلکه مفهوم آن در نظر داشتن دیدگاه مشتری در اولویت بالاتر نسبت به دیدگاه شخصی است.

در صورتی که شما عادت بد دیگری را سراغ دارید، خوشحال می شوم آن را به اشتراک بگذارید.

منبع تصویر: worthlessgenius.com

شاد باشید :)

نکاتی در زمینه استفاده راحت تر از پایگاه داده MySQL

سلام :)

در طول چند سال کار با پایگاه داده MySQL تعدادی Tips (نکته یا راهنما) یاد گرفتم که کار با آن را برای من ساده تر می کردند. مطلب امروز تعدادی از این نکات را معرفی می کند.

نمایش عمودی نتایج
برای مشاهده عمومی نتایج یک query به جای ; از \G در انتهای آن استفاده کنید. مانند:

mysql> select * from PARTITIONS limit 2 \G
*************************** 1. row ***************************
                TABLE_CATALOG: NULL
                 TABLE_SCHEMA: information_schema
                   TABLE_NAME: CHARACTER_SETS
               PARTITION_NAME: NULL
            SUBPARTITION_NAME: NULL
   PARTITION_ORDINAL_POSITION: NULL
SUBPARTITION_ORDINAL_POSITION: NULL
             PARTITION_METHOD: NULL
          SUBPARTITION_METHOD: NULL
         PARTITION_EXPRESSION: NULL
      SUBPARTITION_EXPRESSION: NULL
        PARTITION_DESCRIPTION: NULL
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 384
                  DATA_LENGTH: 0
              MAX_DATA_LENGTH: 16604160
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP:
              TABLESPACE_NAME: NULL
*************************** 2. row ***************************
                TABLE_CATALOG: NULL
                 TABLE_SCHEMA: information_schema
                   TABLE_NAME: COLLATIONS
               PARTITION_NAME: NULL
            SUBPARTITION_NAME: NULL
   PARTITION_ORDINAL_POSITION: NULL
SUBPARTITION_ORDINAL_POSITION: NULL
             PARTITION_METHOD: NULL
          SUBPARTITION_METHOD: NULL
         PARTITION_EXPRESSION: NULL
      SUBPARTITION_EXPRESSION: NULL
        PARTITION_DESCRIPTION: NULL
                   TABLE_ROWS: 0
               AVG_ROW_LENGTH: 231
                  DATA_LENGTH: 0
              MAX_DATA_LENGTH: 16704765
                 INDEX_LENGTH: 0
                    DATA_FREE: 0
                  CREATE_TIME: NULL
                  UPDATE_TIME: NULL
                   CHECK_TIME: NULL
                     CHECKSUM: NULL
            PARTITION_COMMENT:
                    NODEGROUP:
              TABLESPACE_NAME: NULL

استفاده از --safe-updates
با استفاده از پارامتر --safe-updates (:معادل --i-am-a-dummy یا -U) می توانید یک حصار امنیتی برای query های مربوط به update و delete فعال کنید. بدین صورت که اگر query حذف یا ویرایش شما where نداشته باشد، اجرا نمی شود. مانند:

mysql> delete from meta;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

یا

mysql> update meta set meta_key = 'my_key';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

همچنین شما می توانید به جای استفاده از پارامتر --safe-updates از دستور SET در MySQL استفاده نمایید. مانند:

mysql> SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;

دستور بالا علاوه بر فعال کردن safe updates ، حداکثرهایی نیز برای محدودیت select ساده و انتخاب چندین جدولی اعمال می کند.

فعال سازی auto complete و بروزرسانی cache آن
بعد از نصب MySQL در بسیاری از موارد قابلیت auto complete یا همان «کامل کردن خودکار» فعال است. پارامتر مربوط به فعال سازی آن --auto-rehash می باشد. همچنین شما می توانید در خط فرمان MySQL با تایپ \# این قابلیت را فعال کنید. کاربرد دیگر \# بروزرسانی کش auto completion بعد از انجام تغییرات بر روی پایگاه داده می باشد.
*برای کامل کردن یک خط کافیست دکمه Tab را فشار دهید. در صورتی که نتایج برای کامل کردن یک عبارت بیش از یک مورد باشد، با زدن دو tab پشت سر هم، فهرست این نتایج را مشاهده می فرمایید.

مشاهده فهرست کامل فرایندهای در حال اجرا
برای مشاهده فرایندهای در حال اجرا کافیست دستور show processlist را در خط فرمان وارد کنید. همچنین برای نمایش کامل query در حال اجرا می توانید پارامتر full را به این دستور اضافه کنید. مانند:

mysql> show full processlist;
+------+------+-----------+---------+---------+------+-------+-----------------------+
| Id   | User | Host      | db      | Command | Time | State | Info                  |
+------+------+-----------+---------+---------+------+-------+-----------------------+
| 3101 | root | localhost | efs_tmp | Query   |    0 | NULL  | show full processlist |
+------+------+-----------+---------+---------+------+-------+-----------------------+

کشتن (kill) یک فرایند
در ستون اول خروجی دستور show processlist آی دی مربوط به فرآیند در حال اجرا را مشاهده کردید. برای متوقف ساختن این فرایند کافیست دستور kill را به صورت زیر اجرا کنیم:

mysql> kill 3101;

مشاهده وضعیت MySQL و برخی اطلاعات بیشتر
برای مشاهده وضعیت کلی MySQL شامل تنظیمات و پارامتر های فعال شده از دستور show status استفاده می کنیم. مانند:

mysql> show status;
+-----------------------------------+-----------+
| Variable_name                     | Value     |
+-----------------------------------+-----------+
| Aborted_clients                   | 3         |
| Aborted_connects                  | 0         |
| Binlog_cache_disk_use             | 0         |
| Binlog_cache_use                  | 0         |
| Bytes_received                    | 1346      |
..........
........
......
...
.

همچنین برای مشاهده وضعیت INNODB از دستور SHOW ENGINE INNODB STATUS استفاده نمایید.
دستور show table status نیز برای مشاهده وضعیت جداول استفاده می شود. مانند:

mysql> show table status like '%user%' \G
*************************** 1. row ***************************
           Name: user
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 14
 Avg_row_length: 80
    Data_length: 1128
Max_data_length: 281474976710655
   Index_length: 2048
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2010-11-21 18:07:11
    Update_time: 2011-02-27 14:57:28
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
 Create_options:
        Comment: Users and global privileges
1 row in set (0.00 sec)

* از like برای محدود ساختن نتایج استفاده کرده ام.

دسترسی سریع به وضعیت پایگاه داده
برای دسترسی سریع به پایگاه داده کافیست دستور \s را در خط فرمان MySQL وارد نمایید:

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.1.49, for debian-linux-gnu (i686) using readline 6.1

Connection id:		3103
Current database:	mydb_tmp
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.1.49-1ubuntu8.1 (Ubuntu)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	latin1
Conn.  characterset:	latin1
UNIX socket:		/var/run/mysqld/mysqld.sock
Uptime:			12 hours 39 min 28 sec

Threads: 1  Questions: 27846  Slow queries: 2  Opens: 7711  Flush tables: 1  Open tables: 64  Queries per second avg: 0.611
--------------

دستور show create
به طور کلی دستور show create برای مشاهده نحوه ساخت یک جدول، پایگاه داده، تابع و… استفاده می شود. مانند:

mysql> show create database mysql \G
*************************** 1. row ***************************
       Database: mysql
Create Database: CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */

یا

mysql> show create table time_zone \G
*************************** 1. row ***************************
       Table: time_zone
Create Table: CREATE TABLE `time_zone` (
  `Time_zone_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Use_leap_seconds` enum('Y','N') NOT NULL DEFAULT 'N',
  PRIMARY KEY (`Time_zone_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Time zones'

ساخت یک جدول از ترکیب چند جدول
یکی از انواع engine های موجود در MySQL انجین MERGE یا MRG_MyISAM می باشد. این engine برای ترکیب چندین جدول در یک جدول مورد استفاده قرار می گیرد.
در زیر ما دو جدول با انجین MyISAM و یک جدول total با انجین MERGE از ترکیب دو جدول اول ساخته ایم:

mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

در صورت وارد کردن اطلاعات به t1 و t ویا بروزرسانی اطلاعات آن ها، امکان دستیابی به اطلاعات از طریق جدول total وجود دارد. مانند:

mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');

mysql> SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+

دستور mysqlshow برای دسترسی سریع به فهرست اطلاعات
شما می توانید برای دسترسی سریع به فهرست پایگاه های داده، جداول و ستون های آنها از دستور mysqlshow استفاده نمایید. مانند:

$ mysqlshow -uroot
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mydb_tmp            |
| mydb               |
| mysql              |
| radius             |
| security           |
+--------------------+

یا

$ mysqlshow -uroot mysql
Database: mysql
+---------------------------+
|          Tables           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+

یا

$ mysqlshow -uroot mysql servers
Database: mysql  Table: servers
+-------------+----------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field       | Type     | Collation       | Null | Key | Default | Extra | Privileges                      | Comment |
+-------------+----------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Server_name | char(64) | utf8_general_ci | NO   | PRI |         |       | select,insert,update,references |         |
| Host        | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
| Db          | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
| Username    | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
| Password    | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
| Port        | int(4)   |                 | NO   |     | 0       |       | select,insert,update,references |         |
| Socket      | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
| Wrapper     | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
| Owner       | char(64) | utf8_general_ci | NO   |     |         |       | select,insert,update,references |         |
+-------------+----------+-----------------+------+-----+---------+-------+---------------------------------+---------+

مرتب سازی همراه با ارجحیت
در صورتی که قصد دارید علاوه بر مرتب سازی یک query انتخاب، ارجحیتی نیز به بعضی از ریف های آن بدهید، کافیست از ترکیب IN() و order by استفاده کنید. در مثال زیر علاوه بر مرتب سازی بر اساس ستون iso_code به ردیف های IR و US ارجحیت و وزن بالاتری داده ایم:

mysql>SELECT * FROM countries ORDER by iso_code IN ('IR', 'US') desc;
+----------+----------------------------------------+
| iso_code | name                                   |
+----------+----------------------------------------+
| IR       | IRAN                         |
| US       | United States                          |
| AF       | Afghanistan                            |
| AL       | Albania                                |
| DZ       | Algeria                                |
| AS       | American Samoa                         |
+----------+----------------------------------------+

امیدوارم که این مطلب راهنمای خوبی برای استفاده راحت تر و مفید تر از پایگاه داده MySQL باشد.

موفق باشید 8)