جب مستقل کسی اور کا قانون ہو تو کیا کریں۔

ایک ساتھی کارکن نے پوچھا کہ میرے کوڈ میں ایک نمبر پر تین لائنوں کے تبصرے کیوں ہیں۔ نمبرات درج ذیل ہیں: 18.

تبصرے میں بتایا گیا کہ یہ کس قاعدہ سے آیا ہے، اسے کس سیکشن کے بارے میں مطلع کیا گیا تھا، اور یہ کہ یہ بغیر اطلاع کے تبدیل ہو سکتا ہے۔ یہ دو ہندسوں کے عدد کے لئے بہت زیادہ رسم کی طرح محسوس ہوا جب تک کہ مجھے متبادل یاد نہ آئے۔

زیادہ تر سافٹ ویئر میں، مستقل فیصلہ صارف کے ذریعے کیا جاتا ہے۔ سافٹ ویئر میں جو ضابطے کو نافذ کرتا ہے، مستقل فیصلے ہوتے ہیں۔ دوسرے لوگ وہ آپ کے نوٹس کے بغیر تبدیل ہو سکتے ہیں اور ہو سکتا ہے کہ ان میں قانونی طور پر درست اقدار نہ ہوں اور ہو سکتا ہے پہلی بار صحیح طریقے سے نہ پڑھا جائے۔

میں نے فنانشل کیلکولیٹرز کا ایک سیٹ بناتے ہوئے مشکل طریقے سے دونوں آدھے حصے سیکھے۔ یہاں کیا غلط ہوا، اور کسی بھی کوڈ پر لاگو کرنے کی تین عادات جو دوسروں کی ملکیت والے قواعد کو انکوڈ کرتی ہیں۔

یہ مضمون ان ڈویلپرز کے لیے ہے جو کوڈ لکھتے ہیں جو کسی اور کی ملکیت والے قوانین کو نافذ کرتا ہے، جیسے ٹیکس، تنخواہ، فوائد، قرضے، یا ڈومینز جہاں ریگولیٹرز یا اسٹینڈرڈ باڈیز صارف سے پوچھے بغیر نمبر سیٹ کر سکتے ہیں اور ان میں ترمیم کر سکتے ہیں۔ اگر آپ نے کبھی کسی ایسی شرح کو سختی سے کوڈ کیا ہے جو بعد میں بدل گیا ہے، تو یہ آپ کے لیے ہے۔

شرائط:

آپ کو کافی جاوا اسکرپٹ کی ضرورت ہوگی اور مختصر ٹکڑوں کو پڑھنے کے لیے جائیں۔ دونوں ذیل میں دکھائے گئے ہیں، لیکن صرف مثال کے طور پر استعمال ہوتے ہیں۔ یہاں کسی بھی چیز کا انحصار کسی بھی زبان کے گہرے علم پر نہیں ہے۔

میرا فنانس یا ٹیکس میں کوئی پس منظر نہیں ہے اور میں پہلی بار سامنے آنے والی ہر ڈومین اصطلاح کی وضاحت کروں گا۔ اس کی مثال ہندوستانی جی ایس ٹی کی ہے۔ کیونکہ یہ بگ انڈین جی ایس ٹی میں آیا ہے۔ تاہم، ناکامی کے تین طریقوں میں سے کوئی بھی ہندوستان، ٹیکس یا کسی ایک دائرہ اختیار تک محدود نہیں ہے۔

ہم کیا احاطہ کریں گے:

بگ جو قابل فہم نمبر لوٹاتا ہے۔

آئیے بدترین قسم کے ساتھ شروع کریں کیونکہ یہ بالکل بھی بگ کی طرح نہیں لگتا ہے۔

ہندوستان میں، سامان اور خدمات ٹیکس کی دیر سے ادائیگی پر سود وصول کیا جاتا ہے۔ یہاں ظاہری نفاذ ہے: واجب الادا ٹیکس کا حساب لگائیں، سالانہ ٹیکس کی شرح سے ضرب لگائیں، اور مجرمانہ دنوں کی تعداد کا حساب لگائیں۔

const interest = taxOwed * (ratePct / 100) * (days / 365);

کوڈ ریاضی کے لحاظ سے مکمل ہے۔ مزید یہ کہ حقیقی معاملات میں یہ تعداد کئی گنا زیادہ ہے۔

وجہ یہ ہے کہ ‘ادائیگی کے لیے ٹیکس’ ایک عدد نہیں ہے۔ آپ کے جی ایس ٹی ریٹرن میں آپ کی مجموعی پیداوار، یعنی آپ کی فروخت کردہ ہر چیز پر کل ٹیکس شامل ہوتا ہے۔ تاہم، زیادہ تر کاروبار اس کا ایک بڑا حصہ ان پٹ ٹیکس کریڈٹ کے ذریعے طے کرتے ہیں، یعنی وہ ٹیکس جو وہ اپنی خریداریوں پر پہلے ہی ادا کر چکے ہیں۔ صرف باقی رقم نقد ادا کی جاتی ہے۔ اور سود ان قوانین کے مطابق چلتا رہتا ہے جو اس پر حکومت کرتے ہیں۔ ٹیکس اصل میں نقد میں ادا کیا جاتا ہےیہ مکمل ذمہ داری نہیں ہے۔

تو ہمارے پاس ایک ہی فارمولا، ایک ہی تناسب اور دو مختلف ان پٹ ہیں۔ اور ان میں سے ایک غلط ہے۔

90 days late at 18% p.a.
  on cash actually paid   (₹50,000)    →   ₹2,219
  on gross liability      (₹3,00,000)  →  ₹13,315

سود 6 گنا ہے۔ دونوں نمبر وہی ہیں جو فارمولہ واپس کرتا ہے۔ یہ پھینکتا بھی نہیں ہے۔ دونوں یقینی طور پر اشتعال انگیز نہیں لگتے ہیں۔ اگر آپ ایک ڈویلپر ہیں، تو آپ کے ٹیسٹ پاس ہو جائیں گے کیونکہ آپ نے انہیں اپنے کوڈ کی طرح غلط فہمیوں کے لیے لکھا ہے۔

یہ ناکامی کے طریقے ہیں جو ریگولیٹری کوڈز کو مختلف بناتے ہیں۔ عام کیڑے اسٹیک ٹریس یا نمبر تیار کرتے ہیں جو کسی کے نوٹس کرنے کے لئے کافی غلط ہیں۔ اس سے صحیح شکل، صحیح سائز کا آرڈر، اور یقینی طور پر غلط نمبر پیدا ہوتا ہے۔

اصل میں مسئلہ کو حل کرنے کا طریقہ

بہتر جانچ سے یہ مسئلہ حل نہیں ہوگا۔ بہتر دستاویزات کے تبصرے کرتے ہیں۔

حل یہ ہے کہ اپنی تعریف کی سائٹ میں درج ذیل کو لکھیں: کوئی بھی پیرامیٹرز کی مقدار اور ان کی ضروریات کے ذرائع درج ذیل ہیں:

// GSTInterest returns interest on a late GST payment.
//
// Under Rule 88B(1) interest runs on the tax actually debited from the
// electronic cash ledger — NOT on the gross output liability. Getting
// this wrong overstates the interest, often by several times. Pass
// cashTaxPaid as the cash-ledger portion, not the gross bill.
//
// Pass annualRatePct as DefaultGSTInterestRate unless the notified rate
// has moved; 18% p.a. is currently notified under Section 50(1).
func GSTInterest(cashTaxPaid float64, days int, annualRatePct float64) float64

نوٹ کریں کہ پیرامیٹرز کو کہا جاتا ہے: cashTaxPaidنہیں amount. نام مکمل دفاع ہے۔ ایک کال کرنے والا جس کے پاس کل بل ہاتھ میں ہے اسے ضرور رکنا چاہیے اور پوچھنا چاہیے کہ آیا نمبر درست ہے (یہ بالکل کیڑے کو روکنے کے لیے ایک وقفہ ہے)۔

میں آگے جاؤں گا: اگر ایک پیرامیٹر کو ایک جیسی مقدار کے ساتھ الجھن میں ڈالا جا سکتا ہے، تو نام کو الجھن کو ناممکن بنا دینا چاہیے۔ amount غلطیوں کو دعوت دی جاتی ہے۔ cashTaxPaid منع کرو۔

مستقل جو آپ سوتے وقت بدلتے ہیں۔

دوسرا ناکامی موڈ سست اور زیادہ شرمناک ہے۔

ٹیکس بریکٹ آپ کے سالانہ بجٹ کی بنیاد پر منتقل ہوتے ہیں۔ قانونی بالا حد نوٹیفکیشن کے ذریعے نظر ثانی کی گئی ہے۔ ٹپ کی حدیں چند سالوں تک ایک نمبر پر رہتی ہیں، پھر نہیں۔ ان میں سے کوئی بھی تبدیلی ریلیز کے شیڈول سے متعلق نہیں ہے۔

ایک پرکشش نفاذ ایک مستقل ہے۔

const gratuityCeiling = 2000000

اب سوچیں کہ اس سے کس کو تکلیف ہوئی؟ نہ صرف پرانے نمبر پڑھنے والے صارفین کے لیے۔ ڈویلپر آپ وہ ہیں جو منگل کو تبدیلیوں کو دریافت کرتے ہیں، انحصار میں پکی ہوئی اقدار کو تلاش کرتے ہیں، اور پھر کوئی مسئلہ پیش کرنے اور انتظار کرنے کے علاوہ کچھ نہیں کر سکتے۔

ایک زیادہ باریک مسئلہ بھی ہے۔ قانونی اعداد و شمار اکثر ایک ہی قدر نہیں ہوتے ہیں۔ وہ ایک قدر ہیں زیادہ تر لوگوں کو. کچھ سرکاری ملازمین کے لیے یہی حد زیادہ ہے۔ سروس کی وہی کم از کم مدت مقررہ مدت کے ملازمین کے لیے کم ہے۔ پوشیدہ مستقل ممکنہ طور پر باسی نہیں ہیں۔ یہ صارفین کی پوری کلاس کے لیے ہمیشہ کے لیے اور خاموشی سے غلط ہے۔

تو: قانونی قدر بنائیں دستاویزی ڈیفالٹس کے ساتھ اختیاراتکوئی پوشیدہ مستقل نہیں ہیں۔

// GratuityOptions carries the statutory figures that change by
// notification. The zero value means "use the defaults".
type GratuityOptions struct {
    Ceiling  float64 // 0 -> 20,00,000. Use 25,00,000 for Central Government civil employees.
    MinYears float64 // 0 -> 5. Use 1 for fixed-term employees.
}

0 کی قدر اب بھی عام معاملے میں صحیح کام کرتی ہے، اس لیے کوئی بھی شروع کرنے کے لیے پیچیدگی ٹیکس ادا نہیں کرتا ہے۔ تاہم، ان دنوں میں جب نمبرز حرکت میں آتے ہیں، کال کرنے والے فوری طور پر مجھے ریلیز روکنے کا انتظار کیے بغیر خود ہی درست کر سکتے ہیں۔

وہ آخری شق اصل نکتہ ہے۔ جب آپ کا کوڈ ان قوانین کو انکوڈ کرتا ہے جن پر آپ کا کوئی کنٹرول نہیں ہوتا ہے، صارفین کو اوور رائیڈز کی ضرورت ہوتی ہے جو ریلیز کے بہاؤ سے نہیں گزرتے ہیں۔

فارموں پر لائیو توثیق

تیسرے نے مجھے ری فیکٹرنگ کے دوران پکڑا، اور یہ ہجرت کرنا سب سے آسان ہے۔

قرض کی ادائیگی کا شیڈول بنانے کی صلاحیت موجود تھی۔ دوسرے الفاظ میں، مدت مرحلہ وار لکھا گیا تھا، ہر ماہ ایک قطار. یہ ایپ کے اندر محفوظ تھا۔ فارم میں زیادہ سے زیادہ وصف ہے۔ UI فکسڈ ان پٹ۔ کوئی بھی 200 سالہ قرض کی درخواست نہیں کر سکتا کیونکہ انٹرفیس اس کی اجازت نہیں دیتا۔

پھر میں نے حساب کتاب لائبریری میں نکالا اور فارم اب موجود نہیں رہا۔

rows, _ := Amortisation(principal, rate, months) // months came from where?

لوپ صرف منظور شدہ اصطلاح تک محدود ہے۔ بکواس اقدار کا استعمال غلط جوابات واپس نہیں کرے گا یا آہستہ چلائے گا۔ یہ صرف ہے بھیجنے والے عمل ختم ہو جاتا ہے۔ میرا بگ، آؤٹ آف میموری کریش، ایک ایسے پروگرام میں ہے جسے میں نے پہلے کبھی نہیں دیکھا۔

ٹھیک کرنا بہت اچھا نہیں ہے۔ یہ کسی فنکشن میں گارڈ کو شامل کرنے کے بارے میں ہے۔

const MaxMonths = 1200 // 100 years

rows, err := Amortisation(principal, rate, 2000)
// err: months must be at most 1200, got 2000

چھت جان بوجھ کر مضحکہ خیز ہے۔ حقیقت میں، سب سے طویل ہوم لون فروخت ہوتے ہیں 30-40 سال، لہذا 100 سال صرف ان پٹ ہیں اور اس کا کوئی مطلب نہیں ہے۔ یہ وہ خصوصیات ہیں جو ہم اپنے محافظ میں چاہتے ہیں: یہ ناممکن ہونا چاہئے کہ کسی کے لئے اتفاقی طور پر اس سے ٹکرا جائے، لہذا کوئی اس سے بحث نہیں کرسکتا۔

عام سبق کسی ایک خصوصیت سے بڑا ہے۔ جب آپ اپنی ایپلیکیشن سے لائبریری کو نکالتے ہیں، تو UI تمام ان پٹ توثیق کو وراثت میں لے لیتا ہے جو خود کار طریقے سے کرتا تھا: کسی اور کا حادثہ

تین عادات

اگر آپ کوڈ لکھ رہے ہیں جو ان اصولوں کو نافذ کرتا ہے جو آپ نے نہیں لکھے ہیں، تو آپ کو تین عادتیں اب اپنانی چاہئیں۔

یہ "تناسب” نہیں ہے۔ کوئی بھی قاعدہ کوئی بھی یہ سیکشن تبدیلی کے تابع ہے۔ مندرجہ بالا تبصرہ میں واضح طور پر رول 88B(1) اور سیکشن 50(1) بیان کیا گیا ہے تاکہ میرے کام کی جانچ کرنے والے کو معلوم ہو کہ کیا چیک کرنا ہے، اور جو قارئین متفق نہیں ہیں وہ مجھ پر بھروسہ کرنے کی بجائے ماخذ کو پڑھ سکتے ہیں۔

2. مستقل کی بجائے پہلے سے طے شدہ قدر کا استعمال کرتے ہوئے ایک قانونی قدر کا اختیار بنائیں۔

0 کی قدر عام کیس کو ہینڈل کرتی ہے۔ اوور رائیڈنگ ان دنوں کو سنبھالتی ہے جب قانون حرکت میں آتا ہے اور صارف کی کلاسیں جن کے لیے ڈیفالٹس کبھی مناسب نہیں ہوتے۔

3. گارڈ کو فارم سے فنکشن میں منتقل کریں۔

UI کے ذریعہ کی گئی تمام توثیق لائبریری کے ذریعہ کی گئی توثیق نہیں ہیں۔ فرض کریں کہ درج ذیل کالر کے پاس کوئی UI نہیں ہے:

اس میں سے کوئی بھی غیر ملکی نہیں ہے۔ یہ آپ کے ان پٹ پر بھروسہ نہ کرنے کا ایک عمومی نظم ہے، تعریف کچھ ان پٹ دوسروں کے ذریعہ ترتیب دیے گئے ہیں اور ٹائم ٹیبل کے مطابق ان میں ترمیم کی گئی ہے۔

اس کے الگ سے نام دینے کے قابل ہونے کی وجہ ڈومین کے مخصوص ناکامی کے دستخط کی وجہ سے ہے (کوئی استثنا نہیں، کوئی اسٹیک ٹریس نہیں، واضح طور پر غلط آؤٹ پٹ نہیں)۔ صحیح شکل میں کسی نمبر کے لیے چھ گنا اتنا بڑا نمبر ہے کہ وہ اس رپورٹ پر خاموشی سے بیٹھ سکتا ہے جس پر کوئی عمل کرنے والا ہے۔

ختم

نتائج درج ذیل ہیں:

ضابطوں کو نافذ کرنے والے کوڈ کے اپنے ناکام دستخط ہوتے ہیں۔ کوئی مستثنیات یا اسٹیک ٹریس نہیں ہیں، صرف اعداد جو درست دکھائی دیتے ہیں لیکن واضح طور پر غلط ہیں۔

ہم نے اسے تین طریقوں سے دیکھا ہے۔ پیرامیٹرز جن کا خود بخود مطلب قاعدہ کے ارادے سے مختلف مقدار ہے، قانونی اقدار جو بعد میں قانون کے ذریعہ منتقل کی گئی مستقل کے طور پر طے کی گئی ہیں، اور وہ توثیق جو UI میں رہتی ہیں جب منطق کو لائبریری میں نکالا جاتا ہے۔

تین عادات اس ترتیب میں تین ناکامیوں کا جواب دیتی ہیں۔ اپنی ڈیفینیشن سائٹ میں اپنی اجازتوں کا نام دینے سے آپ کے اگلے قارئین کو معلوم ہوتا ہے کہ آپ کے کام کو کس چیز کے خلاف چیک کرنا ہے۔ یہ قانونی اقدار کو پہلے سے طے شدہ اقدار کے ساتھ اختیارات کے طور پر بے نقاب کرتا ہے، لہذا جس دن قانون حرکت میں آتا ہے آپ لٹریلز تلاش کرنے کے بجائے دلائل کو تبدیل کر سکتے ہیں۔ اور اگلے کال کرنے والے کے پاس بالکل بھی UI نہیں ہوسکتا ہے، اس لیے فنکشن میں گارڈ لگائیں۔

اگر آپ ایک چیز لے جاتے ہیں، تو اس کا نام لیں. amount کیڑے کو مدعو کریں۔ cashTaxPaid منع کرو۔ اور پیرامیٹر کے نام سب سے سستی دستاویزات ہیں جو آپ کبھی لکھیں گے۔

پڑھنے کے لیے شکریہ!

میں بناتا ہوں EMIC کیلکولیٹرہندوستان کے لیے مفت مالی کیلکولیٹروں کا ایک سیٹ جس میں قرض، ایس آئی پی، جی ایس ٹی، گریجویٹی اور ٹیکس شامل ہیں۔ مندرجہ بالا فارمولے یہاں سے نکالے گئے ہیں اور اوپن سورس لائبریری کے طور پر شائع کیے گئے ہیں، اس لیے جو بھی میرے کام کو چیک کرنا چاہتا ہے وہ ریاضی کا آڈٹ کر سکتا ہے۔

Scroll to Top