برنامه نویسی

چرا کد پاک مهم است – انجمن DEV

Summarize this content to 400 words in Persian Lang
در پروژه‌های مشاوره‌ای مختلف، اخیراً متوجه شده‌ام که همان چیزی که مدام تکرار می‌شود: کدهای خوشه‌ای. منظورم از آن چیست؟ خب بذار اینجوری بگم هنگام کدنویسی، باید به کد پاک فکر کنید. بله، می دانم، یک نفر دیگر آنجا در مورد کد پاک صحبت می کند. چرا باید به من گوش کنی؟ از 12 سالگی به کامپیوتر و نحوه کار کردن چیزها علاقه داشتم. وقتی 15 ساله شدم، شروع به تماشای Pluralsight کردم، یک سری ویدیو در مورد نحوه انجام MVVM، MVC، معماری و غیره. هزاران ویدیو تماشا کردم، اما هنوز برنامه نویسی را بلد نبودم. من دنبال کردم، اما یادم می‌آید که خیلی از اتفاقات را درک نمی‌کردم.

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

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

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

هنگامی که آن مشکل وجود دارد، بازگشت به عقب و رفع آن واقعاً دشوار است. بر اساس تجربه من، مردم اغلب برای بازسازی پروژه های خود باز نمی گردند – حداقل نه افرادی که من می شناسم. اگر متفاوت هستید به من اطلاع دهید. برای Refactor کارهای مختلفی می توانید انجام دهید و کمک زیادی می کند، اما مشکل این است که اولویت بندی نشده است. اگر کد کار می کند و کلاینت راضی است، refactoring در بالای لیست نیست. اما بیایید دو یا سه سال آینده فکر کنیم. وقتی کد بیشتر و بیشتر خوشه‌بندی شود چه اتفاقی می‌افتد؟

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

استراتژی های عملی برای کد پاک

بررسی کد سازگاربررسی‌های منظم کد، پایبندی به استانداردهای کدگذاری را تضمین می‌کند و مشکلات احتمالی را زودتر تشخیص می‌دهد.

تست خودکاراجرای تست خودکار، از جمله تست‌های واحد، تست‌های یکپارچه‌سازی، و تست‌های انتها به انتها، به شناسایی مشکلات قبل از شروع تولید کمک می‌کند.

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

اتخاذ اصول SOLIDاصول SOLID (مسئولیت منفرد، باز-بسته، جایگزینی Liskov، جداسازی رابط، و وارونگی وابستگی) چارچوبی برای نوشتن کد تمیز و قابل نگهداری فراهم می‌کند.

پاک کردن مستنداتنوشتن مستندات واضح و مختصر به توسعه دهندگان جدید کمک می کند تا پایگاه کد را سریعتر درک کنند و احتمال ایجاد خطا را کاهش می دهد.

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

مزایای طولانی مدت کد پاک

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

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

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

مقیاس پذیری بیشترکد پاک امکان مقیاس بندی آسان تر برنامه ها، ساده سازی فرآیند افزودن ویژگی های جدید و انطباق با نیازهای متغیر را فراهم می کند.

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

نمونه کد آشفته

class User extends security\Session
{
protected $app;

public function __construct($app)
{
$this->app = $app;
}

public function addSkill(Application $app, Request $request)
{
$userInput[‘id’] = $request->request->get(‘id’, null);
$userInput[‘id’] = preg_replace(“/[^0-9,.]/”, “”, $userInput[‘id’]);

$app[‘checkpoint’]->minimumRole(1);
$user = $app[‘session’]->get(‘user’, []);
$userId = $user[‘profile’][‘easyJobAddressId’];

if ($userInput[‘id’] === null) {
return $app->json([‘ok’ => true]);
}

$app[‘dbs’][‘appMySql’]->insert(‘skills’, [
‘skillId’ => $userInput[‘id’],
‘userId’ => $userId,
‘rank’ => 0
]);

return $app->json([‘ok’ => true]);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد بازسازی شده

کد بازسازی شده با تفکیک مسئولیت ها، استفاده از تزریق وابستگی و پیروی از اصول SOLID به اصول کد تمیز پایبند است.

تزریق وابستگی و سازنده

public function __construct(
UserRoleService $userRoleService, RequestStack $requestStack,
UserRepository $userRepository,
EasyJobServiceInterface $easyJobService,
SkillsRepository $skillsRepository,
AppDataService $appDataService
) {
$this->userRoleService = $userRoleService;
$this->requestStack = $requestStack;
$this->userRepository = $userRepository;
$this->easyJobService = $easyJobService;
$this->skillsRepository = $skillsRepository;
$this->appDataService = $appDataService;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

مسئولیت واحد برای افزودن مهارت ها

#[Route(‘/profile/experience/add’, name: ‘profile_experience_add’, methods: [‘POST’])] public function addExperience(Request $request): JsonResponse
{
$this->denyAccessUnlessGranted(‘ROLE_USER’);
$skillId = $request->request->get(‘id’);

if (!is_numeric($skillId)) {
return $this->json([‘status’ => ‘error’, ‘message’ => ‘Invalid skill ID’]);
}

$userId = $this->getUser()->getId();
$result = $this->appDataService->addSkillToUser($userId, (int) $skillId);

return $this->json([‘status’ => ‘ok’, ‘added’ => $result]);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

تفکیک نگرانی ها

public function index(): Response {
$user = $this->getUser();
$userId = $user->getId();

$allSkills = [90, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31];
$skills = array_fill_keys($allSkills, 0);

$userSkills = $this->appDataService->getSkillsByUserId($userId);
foreach ($userSkills as $skill) {
$skillId = $skill->getSkillId();
if (array_key_exists($skillId, $skills)) {
$skills[$skillId] = 1;
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه کنید که چگونه از appDataService برای جدا کردن سیستم استفاده می کنیم.با جداسازی نگرانی‌ها، ما هر روش را روی یک کار متمرکز می‌کنیم و خواندن و نگهداری کد را آسان‌تر می‌کنیم.

نتیجه

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

در پروژه‌های مشاوره‌ای مختلف، اخیراً متوجه شده‌ام که همان چیزی که مدام تکرار می‌شود: کدهای خوشه‌ای. منظورم از آن چیست؟ خب بذار اینجوری بگم هنگام کدنویسی، باید به کد پاک فکر کنید. بله، می دانم، یک نفر دیگر آنجا در مورد کد پاک صحبت می کند. چرا باید به من گوش کنی؟ از 12 سالگی به کامپیوتر و نحوه کار کردن چیزها علاقه داشتم. وقتی 15 ساله شدم، شروع به تماشای Pluralsight کردم، یک سری ویدیو در مورد نحوه انجام MVVM، MVC، معماری و غیره. هزاران ویدیو تماشا کردم، اما هنوز برنامه نویسی را بلد نبودم. من دنبال کردم، اما یادم می‌آید که خیلی از اتفاقات را درک نمی‌کردم.

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

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

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

هنگامی که آن مشکل وجود دارد، بازگشت به عقب و رفع آن واقعاً دشوار است. بر اساس تجربه من، مردم اغلب برای بازسازی پروژه های خود باز نمی گردند – حداقل نه افرادی که من می شناسم. اگر متفاوت هستید به من اطلاع دهید. برای Refactor کارهای مختلفی می توانید انجام دهید و کمک زیادی می کند، اما مشکل این است که اولویت بندی نشده است. اگر کد کار می کند و کلاینت راضی است، refactoring در بالای لیست نیست. اما بیایید دو یا سه سال آینده فکر کنیم. وقتی کد بیشتر و بیشتر خوشه‌بندی شود چه اتفاقی می‌افتد؟

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

استراتژی های عملی برای کد پاک

بررسی کد سازگار
بررسی‌های منظم کد، پایبندی به استانداردهای کدگذاری را تضمین می‌کند و مشکلات احتمالی را زودتر تشخیص می‌دهد.

تست خودکار
اجرای تست خودکار، از جمله تست‌های واحد، تست‌های یکپارچه‌سازی، و تست‌های انتها به انتها، به شناسایی مشکلات قبل از شروع تولید کمک می‌کند.

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

اتخاذ اصول SOLID
اصول SOLID (مسئولیت منفرد، باز-بسته، جایگزینی Liskov، جداسازی رابط، و وارونگی وابستگی) چارچوبی برای نوشتن کد تمیز و قابل نگهداری فراهم می‌کند.

پاک کردن مستندات
نوشتن مستندات واضح و مختصر به توسعه دهندگان جدید کمک می کند تا پایگاه کد را سریعتر درک کنند و احتمال ایجاد خطا را کاهش می دهد.

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

مزایای طولانی مدت کد پاک

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

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

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

مقیاس پذیری بیشتر
کد پاک امکان مقیاس بندی آسان تر برنامه ها، ساده سازی فرآیند افزودن ویژگی های جدید و انطباق با نیازهای متغیر را فراهم می کند.

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

نمونه کد آشفته



class User extends security\Session
{
  protected $app;

  public function __construct($app)
  {
    $this->app = $app;
  }

  public function addSkill(Application $app, Request $request)
  {
    $userInput['id'] = $request->request->get('id', null);
    $userInput['id'] = preg_replace("/[^0-9,.]/", "", $userInput['id']);

    $app['checkpoint']->minimumRole(1);
    $user = $app['session']->get('user', []);
    $userId = $user['profile']['easyJobAddressId'];

    if ($userInput['id'] === null) {
      return $app->json(['ok' => true]);
    }

    $app['dbs']['appMySql']->insert('skills', [
      'skillId' => $userInput['id'],
      'userId' => $userId,
      'rank' => 0
    ]);

    return $app->json(['ok' => true]);
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد بازسازی شده

کد بازسازی شده با تفکیک مسئولیت ها، استفاده از تزریق وابستگی و پیروی از اصول SOLID به اصول کد تمیز پایبند است.

تزریق وابستگی و سازنده

public function __construct(
    UserRoleService $userRoleService, RequestStack $requestStack,
    UserRepository $userRepository,
    EasyJobServiceInterface $easyJobService,
    SkillsRepository $skillsRepository,
    AppDataService $appDataService
) {
    $this->userRoleService = $userRoleService;
    $this->requestStack = $requestStack;
    $this->userRepository = $userRepository;
    $this->easyJobService = $easyJobService;
    $this->skillsRepository = $skillsRepository;
    $this->appDataService = $appDataService;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

مسئولیت واحد برای افزودن مهارت ها

#[Route('/profile/experience/add', name: 'profile_experience_add', methods: ['POST'])]
public function addExperience(Request $request): JsonResponse
{
    $this->denyAccessUnlessGranted('ROLE_USER');
    $skillId = $request->request->get('id');

    if (!is_numeric($skillId)) {
        return $this->json(['status' => 'error', 'message' => 'Invalid skill ID']);
    }

    $userId = $this->getUser()->getId();
    $result = $this->appDataService->addSkillToUser($userId, (int) $skillId);

    return $this->json(['status' => 'ok', 'added' => $result]);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

تفکیک نگرانی ها

public function index(): Response {
    $user = $this->getUser();
    $userId = $user->getId();

    $allSkills = [90, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31];
    $skills = array_fill_keys($allSkills, 0);

    $userSkills = $this->appDataService->getSkillsByUserId($userId);
    foreach ($userSkills as $skill) {
        $skillId = $skill->getSkillId();
        if (array_key_exists($skillId, $skills)) {
            $skills[$skillId] = 1;
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه کنید که چگونه از appDataService برای جدا کردن سیستم استفاده می کنیم.
با جداسازی نگرانی‌ها، ما هر روش را روی یک کار متمرکز می‌کنیم و خواندن و نگهداری کد را آسان‌تر می‌کنیم.

نتیجه

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا