کانال تلگرام

4 چیزی که برای تبدیل شدن به یک برنامه نویس بهتر باید کنار بگذارید

تاریخ : ۱۷ مهر ۱۳۹۹
نویسنده : حمید رضا ملکی
دسته بندی ها : برنامه نویسی

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

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

nolearnthing

حلقه ها را فراموش کنید

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

const groceries = [
  {
    name: 'Face Masks',
    price: 17.50,
  },
  {
    name: 'Disinfecting Wipes',
    price: 24.99,
  },
  {
    name: 'Goggles',
    price: 8.99,
  },
  {
    name: 'Gloves',
    price: 25.99,
  },
  {
    name: 'Hand Sanitizers',
    price: 24.99,
  },
];

برای مثال در بالا آرایه ای از اشیا را داریم که هرکدام نشان دهنده یک ماده غذایی هستند، اگر شما بخواهید نام هر ماده غذایی را چاپ کنید، چه کاری باید انجام دهید؟

let index = 0;
while (index < groceries.length) {
  console.log(groceries[index].name);
  index = index + 1;
}

در مثال بالا برای رسیدن به کاری که میخواهیم انجام دهیم از حلقه while استفاده شده است، اما باید هر بار که می خواهید کالایی را در خروجی نمایش دهید، باید یکی به index اضافه کنید. اگر این کار را فراموش کنید، دچار یک حلقه بی نهایت خواهید شد و برنامه شما با شکست مواجه میشود. اما اجازه دهید روشی دیگر را مورد بررسی قرار دهیم:

groceries.forEach((item) => {
  console.log(item.name);
});

forEach یک تابع با سطحی بالاتر است، این تابع مجموعه ای را رفته و ما بین آیتم های آن پیمایش میکند، همانطور که در مثال بالا میبینید در هر بار پیمایش نام ماده غذایی در خروجی چاپ میشود. در این صورت برای انجام کارهای تکراری لازم نیست از منطق های اضافه تکراری استفاده کنید. از طرفی کار شما به عنوان یک برنامه نویس ساده تر شده و خطاها کاهش می یابد.

حلقه های for و while خیلی عمومی هستند و صرفا برای قصدی که شما دارید طراحی نشده اند، در نتیجه تا میتوانید از توابع خاص تر استفاده کنید. اگر میخواهید کدهای بهتری داشته باشید، به جای استفاده از این نوع حلقه ها از توابعی مانند forEeach استفاده کنید. در زیر چند مثال دیگر در این باره آورده شده است.

// Before:
let index = 0;
const prices = [];
while (index < groceries.length) {
  prices.push(groceries[index].price);
  index = index + 1;
}
// After:
groceries.map((item) => {
  return item.price;
});
// Before:
let index = 0;
let total = 0;
while (index < groceries.length) {
  total = total + groceries[index].price;
  index = index + 1;
}
// After:
groceries.reduce((sum, item) => {
  return sum += item.price;
}, 0);

دستورات شرطی را فراموش کنید

هر بار که دستور دیگری را اضافه می کنید، پیچیدگی کد خود را دو برابر می کنید. دستورات شرطی مانند دستورات if-else و switch جز بخش های اصلی در هر زبان برنامه نویسی هستند. اما زمانی که بخواهید کدی تمیز بنویسید، مانعی برای این کار محسوب میشوند. خوشبختانه، چندین ترفند برای خلاص شدن از این نوع دستورات وجود دارد.

ساختارهای داده

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

const discount = (amount, code) => {
  switch (code) {
    case 'DIJFNC':
      return amount * 0.80;
    case 'XPFJVM':
      return amount * 0.75;
    case 'FJDPCX':
      return amount * 0.50;
  }
};

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

const DISCOUNT_MULTIPLIER = {
  'DIJFNC': 0.80,
  'XPFJVM': 0.75,
  'FJDPCX': 0.50,
};
const discount = (amount, code) => {
  return amount * DISCOUNT_MULTIPLIER[code];
};

این بازنویسی به طور موثری، داده ها را از منطق محاسبه جدا می کند، در نتیجه اصلاح آن در آینده کار ساده تری است.

چند ریختی

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

const checkout = (amount, paymentMethod) => {
  switch (paymentMethod) {
    case 'credit-card':
      // Complex code to charge ${amount} to the credit card.
      break;
    case 'debit-card':
      // Complex code to charge ${amount} to the debit card.
      break;
    case 'cash':
      // Complex code to put ${amount} into the cash drawer.
      break;
  }
};
const customers = [
  {
    amount: 75.00,
    paymentMethod: 'credit-card',
  },
  {
    amount: 50.00,
    paymentMethod: 'debit-card',
  },
  {
    amount: 25.00,
    paymentMethod: 'cash',
  },
];
customers.forEach(({ amount, paymentMethod }) => {
  checkout(amount, paymentMethod);
});

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

class CreditCardCheckout {
  static charge(amount) {
    // Complex code to charge ${amount} to the credit card.
  }
}
class DebitCardCheckout {
  static charge(amount) {
    // Complex code to charge ${amount} to the debit card.
  }
}
class CashCheckout {
  static charge(amount) {
    // Complex code to put ${amount} into the cash drawer.
  }
}
const customers = [
  {
    amount: 75.00,
    paymentMethod: CreditCardCheckout,
  },
  {
    amount: 50.00,
    paymentMethod: DebitCardCheckout,
  },
  {
    amount: 25.00,
    paymentMethod: CashCheckout,
  },
];
customers.forEach(({ amount, paymentMethod}) => {
  paymentMethod.charge(amount);
});

چند ریختی در شی گرایی به ما کمک میکند تا عبارت های طولانی در کدنویسی را حذف کنیم. هر کلاس دقیقا مسئول یک روش پرداختی است.

از انتخاب نام های بدون معنی برای متغیرها و توابع بپرهیزید

آموزشهای برنامه نویسی مملو نام هایی برای متغیرها و توابع است که معنای خاصی ندارد، زیرا در آموزش هدف یادگیری سریع است، اما در پروژه های واقعی باید از نام های با معنا استفاده کنید. برای مثال:

const arr = [
  'Breakfast Cereal',
  'Candy and Snack',
  'Dairy',
  'Paper Products and Cleaning Supplies',
];
const func = (n) => {
  const i = arr.findIndex(i => i === n);
  console.log(i);
};
func('Dairy');

نمونه مثالی که در بالا به آن اشاره شده است، کار خود را به درستی انجام میدهد، اما این شکل نامگذاری (نام func برای تابع که عملکرد آن را مشخص نمیکند) در یک پروژه واقعی مناسب نیست. خواننده کده های شما نیز با مشاهده این تابع تا زمانی که بدنه تابع را بررسی نکند از عملکرد آن چیزی نمیفهمد. در نمونه مثال زیر کدهای بالا به روشی بهتر بازنویسی شده اند:

const aisles = [
  'Breakfast Cereal',
  'Candy and Snack',
  'Dairy',
  'Paper Products and Cleaning Supplies',
];
const printAisleNumber = (name) => {
  const number = aisles.findIndex((aisleName) => {
    return aisleName === name;
  });
  console.log(number);
};
printAisleNumber('Dairy');

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

حوزه های سراسری را فراموش کنید

هنگامی که برای اولین بار یک زبان برنامه نویسی را انتخاب می کنید، احتمالاً از یک برنامه ساده همچون چاپ Hello World در خروجی شروع میکنید. در این مرحله همه کدهای خود را در یک فایل مینویسید و میدانید که کدهای شما از بالا به پایین اجرا میشوند.

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

مقالات پیشنهادی

مشاهده همه مقالات
ثبت دیدگاه

برای ارسال دیدگاه لازم است ابتدا وارد سایت شوید