Clean Code: DRY & YAGNI

توی این مجموعه از پست های Clean Code قصد دارم تعدادی از نکات مهم رو بگم که شاید بدیهی به نظر برسن ولی در خیلی از موارد اون ها رو رعایت نمی کنیم

این نکات مثل نمک توی غذا هستن بدیهی به نظر میان ولی اگر رعایت نشن غذا خوردن نداره

اصل DRY (یا Don't Repeat Yourself)

هر قسمت از کدت که چیزی رو تکرار کردی این اصل رو زیر پا گذاشتی
مثال:

function a() {
//..... extra logic
return { data: 'text-a', successful: true };
}
function b() {
//..... another extra logic
return { data: 'text-b', successful: true };
}

توی مثال بالا با تکرار کردن این عبارت ما این اصل رو نقض کردیم:

{ data: , successful: }

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

class Result {
  constructor(data, successful) {
    this.data = data;
    this.successful = successful;
  }
}
function a() {
  return new Result('text-a', true);
}
function b() {
  return new Result('text-b', false);
}

حالا توی کد بالا دیگه اون عبارت رو تکرار نکردیم

شاید تکرار کردن یک عبارت ساده توی کدتون در نگاه اول مشکلی ایجاد نکنه اما رعایت کردن این اصل توی تمام بخش های کدتون باعث میشه به ساختار بهتری برسید و مجبور بشید تا اصول دیگه ای هم در کنارش رعایت کنید

حالا با رعایت دو تا نکته دیگه می تونیم کدمون رو باز هم تمیز تر کنیم

۱. بهتره که توابع تا حد ممکن ورودی کمتری داشته باشند
۲. inheritence (یکی از مفاهیم OOP هست) با ارث بردن از یک کلاس دیگه می تونیم از متد ها و پراپرتی های اون کلاس رو استفاده کنیم و در صورت نیاز تغییر بدیم

نمونه کد بهبود یافته:

class Result {
  constructor(data, successful) {
    this.data = data;
    this.successful = successful;
  }
}
class SuccessResult extends Result {
  constructor(data) {
    super()
    this.successful = true;
    this.data = data;
  }
}
class FailureResult extends Result {
  constructor(data) {
    super()
    this.successful = false;
    this.data = data;
  }
}
function a() {
  return new SuccessResult('text-a');
}
function b() {
  return new FailureResult('text-b');
}

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

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

YAGNI (You Aren't Gonna Need It)

این اصل هم میگه کدی که الان نیازش نداری رو ننویس
مثال:
اگر نیاز داری یه عبارت عددی رندوم بسازی، لازم نیست یک تابع بنویسی که هم بتونه با اعداد عبارت رندوم بسازه، هم با حروف

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

یک حالت دیگه ای هم که باید رعایت بشه توی همون مثال آخر DRY گفته شده
شما نباید وابستگی ها و قابلیت های کدتون رو بیشتر از حد نیاز کنید

- علیرضا تاجی