SalmanAA

نوشته های سلمان عرب عامری

SalmanAA

نوشته های سلمان عرب عامری

ترجمه شده از کتاب (97 چیزی که هر برنامه نویسی باید بداند، مجموعه پندهایی از متخصصین، ویراستاری شده توسط Kevlin Henney)

با احتیاط عمل کنید
Seb Rose

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

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

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

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

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


* http://martinfowler.com/bliki/TechnicalDebtQuadrant.html

* منظور از تکرار همان iteration است که در متدولوژی چابک به کار می رود.

اگر بخواهیم بدون استفاده از توابع پیچیده بررسی کنیم که تاریخ وارد شده توسط شخص در فرمت صحیح شمسی وارد شده است یا نه کافی است از عبارت با قاعده زیر استفاده کنیم:

/(13|14)([0-9][0-9])\/(((0?[1-6])\/((0?[1-9])|([12][0-9])|(3[0-1])))|(((0?[7-9])|(1[0-2]))\/((0?[1-9])|([12][0-9])|(30))))/

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

    var str = "1393/11/23";
    //look for "1393/10/10"
    var patt = /(13|14)([0-9][0-9])\/(((0?[1-6])\/((0?[1-9])|([12][0-9])|(3[0-1])))|(((0?[7-9])|(1[0-2]))\/((0?[1-9])|([12][0-9])|(30))))/g;
    var result1 = patt.test(str);
console.log(result1);
str="1393/13/10";
    var result2 = patt.test(str);
console.log(result2);

البته توجه کنید که در این عبارت یک مشکل وجود داره. اون هم اینکه سال کبیسه محاسبه نمی شه و برای اسفند همواره تا 30 رو قبول می کند. بنابراین باید یک کد اضافه هم بگذاریم که اگر تاریخ مورد قبول بود، با استخراج ماه و سال و روز اگر تاریخ طبق دستورات قبل معتبر بود و ماه 12 بود، و  سال کبیسه آنگاه 30 روز قابل قبول باشد و در غیر اینصورت 29 روز قبول کند. بنابراین در ادامه کد زیر را می آوریم:

    if (result1) {
        var pos = str.indexOf('/');
        var year = str.substring(0,pos);
        var nextPos = str.indexOf('/',pos+1);
        var month = str.substring(pos+1,nextPos);
        var day = str.substring(nextPos+1);
        if(month==12 && (year+1) % 4!=0 && day==30) { // kabise = 1379, 1383, 1387,... (year +1) divides on 4 remains 0
            result = false;
    }

کد کامل برنامه :

function checkShamsi(str) {
    var patt = /(13|14)([0-9][0-9])\/(((0?[1-6])\/((0?[1-9])|([12][0-9])|(3[0-1])))|(((0?[7-9])|(1[0-2]))\/((0?[1-9])|([12][0-9])|(30))))/g;
    var result = patt.test(str);
    if (result) {
            var pos = str.indexOf('/');
            var year = str.substring(0,pos);
            var nextPos = str.indexOf('/',pos+1);
            var month = str.substring(pos+1,nextPos);
            var day = str.substring(nextPos+1);
            if(month==12 && (year+1) % 4!=0 && day==30) { // kabise = 1379, 1383, 1387,... (year +1) divides on 4 remains 0
                result = false;
    }   
    return result;
}

نحوه استفاده:

var myvalue="1393/12/30";
if (!checkShamsi(myvalue)) {
    alert("تاریخ وارد شده معتبر نیست!");
    return;
}

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

1- اول کتابخونه رو دانلود کنید. دانلود

2- در فایل اچ تی ام ال خودتون کتابخونه رو اضافه کنید:

<script src="wordifyfa.js"></script>

3- در کد جاوا اسکریپتتون از کتابخونه استفاده کنید.

 var a = 193390;
 var b = wordifyfa(a);
alert(b);

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

آدرس مخزن کد: https://github.com/SalmanAA/wordifyfa