منبع اصلی نوشتار زیر در این لینک قرار دارد

محاسبه ی باقی مانده ی توان یک عدد – Modular Exponentiation

گوس در مورد نظریه اعداد می گوید : نظریه ی اعداد ملکه ی ریاضیات است. (البته سایر ریاضی دانها هم می گویند گوس پادشاه ریاضیات است.) رشته ی کامپیوتر بخشی از ریاضیات است که یکی از اهداف اصلی آن محاسبات است. در ریاضیات هم یکی از بهترین زمینه ها که می توان با کمک آن […]

Related Posts:

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

لذت برنامه نویسی: نمایش نقشه در html5

اینم یه تجربه پراکنده دیگه! من اصلتا وب بلد نیستم. یعنی خیلی کم وب کار کردم و دقیقا هم نمی‌دونم اوضاع از چه قراره. اما توی کارهایی که انجام می‌دم بصورت خیلی محدود نیاز به واسط کاربری تحت وب پیدا می‌کنم و مجبور میشم به این وادی یه سری بزنم. توی آخرین کاری که انجام […] ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

لذت برنامه نویسی: معرفی زبان lua

اینم یه تجربه پراکنده دیگه! امروز با یه زبان جدید آشنا شدم که اسمش lua است. این زبان رو قبلا تو کانفیگ کردن nginx و جاهای دیگه هم دیده بودم. این زبان یک زبان مفصریه و یعنی کامپایلری نداره و زمان اجرا تفسیر و اجر میشه. این زبان به نسبت ساده است و با زبان‌هایی […] ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

به راحتی آب خوردن Regular Expression بنویسید!

اگر برنامه نویس بوده باشید بارها پیش اومده که بخواهید از Regular Expression استفاده کنید و همونطور که میدونید این عبارات باقاعده فهمشون و نوشتنشون خیلی سخته و باید خیلی تو کارتون وارد باشید که بخواهید از حفظ اونها را بنویسید. یک برنامه‌نویس خوش‌فکر و خوش‌سلیقه اومده یک کتابخونه به نام VerbalExpressions به زبان‌های مختلف […] ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

چیست و چرای EME + کمی از انحصارطلبی

به نظر می‌رسد که روند استفاده از ابزار سنگی تا حدود ۴۰٬۰۰۰-۵۰٬۰۰۰ سال پیش به صورت پلکانی بوده‌است. در هر مرحله (انسان ماهر، انسان کارورز، انسان نئاندرتال) استفاده از ابزار سنگی به صورت پیشرفته تری از مرحلهٔ قبل آغاز شده‌است، ولی بعد از شروع هر مرحله، توسعهٔ بیشتر ابزارها کند بوده‌است. این گونه‌های انسان از لحاظ فرهنگی محافظه کار بوده‌اند، ولی از ۵۰٫۰۰۰ سال پیش، فرهنگ مدرن انسان شروع به رشد با سرعت بیشتری نمود. جارد دایموند، نویسندهٔ کتاب سومین شامپانزه، و سایر انسان‌شناسان این موضوع را «جهش بزرگ رو به جلو» می‌نامند.*

قصه از جایی شروع می‌شود که مفهومی به نام دی.آر‌.ام (Digital rights management) و به فارسی مدیریت حقوق دیجیتال شکل می‌گیرد و سی‌دی‌ها قفل‌دار می‌شوند تا دزدی معنوی صورت نگیرد!

ای.ام.ای (Encrypted Media Extension) و به فارسی افزونه‌ی رسانه‌ی رمزنگاری‌شده، API یی در جاوااسکریپت است که این امکان را فراهم می‌آورد که استریم مدیا به صورت رمزنگاری‌شده انجام شود. گوگل و ماکروسافت این امکان در مرورگرهای خود قرار داده‌اند. از آن بابت این API را افزونه می‌خوانند که امکان غیرفعال سازی آن وجود دارد. اما با غیر فعال بودن این امکان، مدیای رمزنگاری شده قابل استفاده نمی‌باشد، مگر آن که جایگزینی برای آن توسط طراح در نظر گرفته شده باشد.

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

این اتفاق در واقع توسط استدیو هالیوود کلید خود که می‌خواست ویدیوهای خود را روی اینترنت قرار دهد اما نه به شکل قابل دانلود. جامعه‌ی نرم‌افزار آزاد در برابر حرکت موزیلا و به کل ورود حقوق دیجیتال به دنیای وب واکنش‌هایی نشان داده. مثلن وب سایت defectivebydesign.org که توسط بنیاد نرم‌افزار آزاد طراحی شده است و در حال جمع‌آوری امضا برای مقابله با این اتفاق است -که من هم آن را امضا کردم-.

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

راستی، برای آشنایی با روش ساده‌ی کار این API، می‌توانید به سایت HTML5rocks نیز مراجعه کنید.

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

ابتدای راه ِ کوردووا(فون گپ)؛ مقدمه:پیکربندی

“برنامه‌ی موبایل خود را با زبان وب بنویسد.”

مجری: معرفی می‌کنم، جناب فون‌گپ بزرگ. سلام. خودتون رو به خوانندهای محترم معرفی کنید جناب فون‌گپ.

فون‌گپ: سلام. فون‌گپ هستم دیگه! فون اهل گپ!

مجری: مچرم. از کارتون بگید.

فون‌گپ: کار خاصی ندارم، فقط به طراحای وب این امکان رو میدم که برای پلتفورم‌ها دیگه هم با زبون وب برنامه بنویسن.

مجری: خیلی عالیه! واسه چه پلتفورمایی مثلن؟

فون‌گپ: مثلن اندروید، آی‌اواس، بلک‌بری، فایرفاکس‌اواس، اوبونتو، ویندوز، مک‌اواس‌اکس، وب‌او‌اس، ویندوز فون 7 و 8، تیزن، کیوت، سیمبین؛ بادا، آمازون فایراواس… اینا دیگه!

مجری: شوخی می‌کنید؟

فون‌گپ: شوخی دارم با شما آقای محترم؟

مجری: همه‌ی این کارا رو خودتون انجام می‌دین؟ اسپانسری؟ چیزی؟ شما گفتید اهل گپ هستید. کمپانی گپ؟

فون‌گپ: اهل گپ رو واسه مزاح گفتم. من اهل ادوبی هستم. همه‌ی این کارا رو که نه… ببینید در واقع من یه واسط هستم که به برنامه‌نویسا برای کار با کوردووا کمک می‌کنم. کوردووا اهل آپاچیه.

مجری: یعنی چی؟ کوردووا؟ کوردووا رو بیشتر معرفی کنید.

فون‌گپ: من و کوردووا ندایم که! کوردووا در واقع یه وب‌سروره. با یه بروزر. شما پروژتون رو با من یا کوردووا میسازید، برنامتون رو با اچ‌تی‌ام‌ال و سی‌اس‌اس و جاوااسکریپت می نویسی بعد میدی واسه کامپایل و برنامت کامپایل میشه!

مجری: گفتی که کوردووا وب‌سروره، خب زبان سمت سرورش پس چیه؟

فون‌گپ: زبان سمت سرور جاوااسکریپته.

مجری: یعنی مثل نود‌جی‌اس؟ انجینش جاوا اسکریپتش چیه؟

فون‌گپ: آره، شاید. انجینش کار بچه‌های خودمونه! به جون شما!

مجری: خب فک کنم بهتر باشه بریم با جناب کوردووا صحبت کنیم. اینجوری مطمئن‌تره

فون‌گپ: یعنی با من صحبت دیگه‌ای ندارید؟ شعرم بلدم بخونما!

مجری: نه آغا، بی خیال!

(کوردووا سرخوشانه وارد می‌شود)

مجری: سلام جناب کوردووا. حالتون خوبه؟

کوردووا: سلام سلام! مرسی شما خوبید؟

مجری: ممنون منم خوبم! قبل از شما ما داشتیم با فون‌گپ صحبت می‌کردیم.

کوردووا: چطورایی فون‎گپ؟

فون‌گپ: هی… خوبم، بدک نیستم.

مجری: فون‌گپ واسه ما گفت یه واسطه! مگه کار کردن با شما سخته؟

کوردووا: نه والا! تفاوت خاصی هم نیست بینمون! یه کپی ادبی ببخشید ادوبی از منه!

فون‌گپ: دیدی گفتم من و کوردووا نداریم.

مجری: شما ناراحت نمیشید که دارن شما رو به یه اسم دیگه ارائه میدن جناب کوردووا؟

کوردووا: نه بابا چه اشکالی داره! دنیا باید آزاد باشه. حالا یکی هم اینجوری از دنیای آزاد استفاده می کنه!

مجری: این جریان منو یاد جریان اپل(مک) میندازه! خیلی جالب بودا!! بعدم اومدن گفتن مک جداس پی‌سی هم جداس! بعدم گفتن mac>pc. ای آغا!

کوردووا: سخت نگیر آقای مجری! دنیای نرم‌افزار آزاد همینه دیگه! با لایسنس ما اهالی آپاچی هنوز آزادی بیشتره!

مجری: درسته! امیدوارم یه روز خوب بیاد! خب فون‌گپ واسمون از پلتفورما گفت و یه چیزایی هم از روش کار! انجین جاوااسکریپتتون رو هنوز نفهمیدیم چیه.

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

مجری: از امکاناتش بگید!

کوردووا: همه کار میشه باهاش کرد! کار با فایل، کار با دیتا و دیتابیس، کار با دوربین، کار با جی‌پی‌اس، کار با میدیا، کار با وب هم که خوراکمه! و دیگه این که اگه یه سرور رست‌فول هم باشه دیگه همه چی اوکیه! چون وقتی بخواید کلود کار کنید فک می‌کنم رقیب نداشته باشم.

مجری: پس خیلی کامله! فکری هم واسه طراحای بازی کردید؟

کوردووا: فکر نمی‌خواد که! از کنواس و اس‌وی‌جی و فریم‌ورک‌ها و گیم‌انجین‌های موجود می‌تونن برای ساخت بازی‌ها استفاده کنن. همه ی فکرایی که واسه وب شده واسه ما صادقه!

مجری: ای ول داری! خب مراحل راه اندازی رو بهمون آموزش بدید.

نصب node.js و استفاده از npm

کوردووا: خب برای شروع بهتره نودجی‌اس رو از اینجا دانلود و نصب کنیم. با خودش کار خاصی نداریم ولی به پکت-منیجرش که npm هست احتیاج داریم.

بعد از نصب توی کنسول این دستور رو اجرا کنید تا از نصب مطمئن بشید!

node -v

اگه برای نصب مشکل داشتید این صفحه یا این صفحه(نصب از روی سورس ِ مخزن) رو ببینید.
خب حالا می‌تونید با استفاده از npm من رو نصب کنید. چون ملت بیشتر فون‌گپ رو میشناسن نصب فون‌گپ رو توضیح میدم. این بچه رو هم انقدر اذیت نکنید…
برای نصب از طریق npm به شکل زیر عمل می‌کنیم.
از پارامتر install برای نصب و از فلگ g- برای global کردن بسته(برای دسترسی از طریق کنسول در همه‌ی مسیرها) استفاده می کنیم.

linux Base:

$ sudo npm install -g phonegap

Windows Base(Run as administrator):

c:> npm install -g phonegap

نصب Android SDK و Java DK و Ant
مثال‌هامون رو روی اندروید می‌زنیم. واسه‌ی کار با اندروید در کنار Android SDK من به  Java Development Kit و Ant هم احتیاج دارم. با unzip کردن کار تمومه. در صورت وجود مشکل در نصب Android SDK روی اوبونتو به این صفحه مراجعه کنید. فراموش نکنید که بعد از unzip کردن، مسیرهای  sdk/platform-tools و sdk/tools رو به PATH سیستم عامل خودتون اضافه کنید. و Environment Variableی با نام ANDROID_HOME رو به سیستم عامل اضافه کنید و مسیر اون رو برابر با مسیر sdk/tools قرار بدین(توی ویندوز به این شکل عمل کنید). بعد از نصب JDK و Ant هم باید Environment Variableهای ANT_HOME و JAVA_HOME رو اضافه کنید.

اگه کارا رو درست انجام داده باشین الان این دو دستو را که اجرا کنید به شما جواب میدن:

java -version

ant -v

اگه همه‌ی کارا دست انجام شده باشن، ما باید بتونید ورژن فون‌گپ رو به این شکل به دست بیارید:

phonegap -v

اگه انجام شد یعنی به احتمال %95 همه‌ی کارا درست انجام شدن و این یعنی تازه اول ماجرا!
میتونید به اینجا و اینجا یه سری بزنید!

احتمالن ادامه دارد…

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

Radar

سلام؛… بعد از مدتی بلاخره آمدم  یک مطلبی بگذارم!
نمیدونم با Radar آشنایی دارید یا نه؟! اگر نه، برای آشنایی اینجا را ببینید.
… احتمالا دیگر میدانید که رادار یک گزارش از بخش‌های اثرگذار در صنعت نرم‌افزار است، یعنی دقیقاً Techniques, Platforms, Tools, Languages and Frameworks. آخرین گزارش چند روز پیش منتشر شد: http://www.thoughtworks.com/radar

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

  • JavaScript در حال حاضر نقش ویژه‌ای در تولیدات نرم‌افزاری ایفا می‌کند؛ از Client-side تا Server و ابزار‌های مثل Grunt.js و PhoneGap و …
  • JVM با زبان‌های Functional ای که روی آن بستر وجود دارند(Scala, Clojure) و حتی Java و Groovy ، همچنان پیشرو است.
  • Functional, Concurrency, Distributed و Reactive: با وجود زبان‌هایی همچون Scala, Clojure, Elixir و Go و چارچوب‌هایی مثل Akka و Playframework در این گزارش، نمی‌شود انتظار یک جنبش به سمت ‌‌Reactive Programing را نداشت.  می‌توانید اینجا بیشتر در موردش بخوانید.
  • BigData را نمی‌شود فراموش کرد(‌Hadoop2, Storm, ElasticSearch).

البته این گزارش نکات جالب دیگری هم دارد، ولی من به همین میزان اکتفا می‌کنم.

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

Snap.svg؛ تمساح ادوبی

مارتین لوتر کینگ در بخش سوم اتوبیوگرافی خود، درباره‌ی ابرانسان نیچه این گونه می‌گوید: “در نظر نیچه ابرانسان کسی است که می‌خواهد انسان را چنان شگفت زده کند که انسان بوزینه را شگفت زده کرد.

Snap.svg یک فریم‌ورک جاوااسکریپت است که می‌تواند برای طراحی و انیمیت یا پویانمایی گرافیک‌هایی بر پایه‌ی svg مورد استفاده قرار گیرد.

اسنپ.اس‌وی‌جی را دمیتری بارانوفسکی طراحی کرده است، طراح رافائل‌جی‌اس. دمیتری از بچه‌های خط ادوبی‌ست.

قبل از شروع چند دموی جالب ببینید.

در ابتدا

خب، برای شروع می‌تونیم مخزن اسنپ رو از گیت‌هاب دریافت کنیم و فایل dist/snap.svg-min.js رو توی یه فایل اچ‌تی‌ام‌ال فراخوانی کنیم.

یا می‌تونیم فقط خود فایل رو دریافت کنیم.

برای استفاده راحت‌تر از اسنپ می‌تونیم یه متغییر واسه سلکتور تعریف کنیم.

var s = Snap("#svg");

نکته:کد خودمون رو باید توی تابع window.onload قرار می‌دیم. به این صورت:

window.onload = function(){
	var s = Snap("#svg");
};

نیاز هست که توی body صفحمون یه تگ svg قرار بدیم و id اون رو برای مثال بذاریم svg که بتونیم با سکلتورمون باهاش کار کنیم.

رسم اولین شکل
اولین شکلی که میخوایم بکشیم یه دایرس. اینجوری میکشیمش:

window.onload = function(){
	var s = Snap("#svg");
	var bigCircle = s.circle(150, 150, 100);
};


در تابع circle که برای رسم دایره استفاده میشه، عدد اول x، عدد دوم y و عدد سوم شعاع دایرمونه. رنگ دایرمون به صورت پیش‌فرض سیاهه.
نتیجه رو می‌تونید دریافت کنید و ببینید.

خب، یکم رنگ کنیم دایرمون رو؟ این چند خط که صفات معمولی svg هستن رو به کدمون اضافه می‌کنیم. این صفات به ترتیب رنگ شکل، رنگ دیواره و سایز دیواره هستن. همونطور که مشخصه از element.attr برای دادن صفت به شکلمون استفاده می‌کنیم.

bigCircle.attr({
	fill: "#bada55",
	stroke: "#000",
	strokeWidth: 5
});

دایرمون اینجوری میشه:

انیمیت کردن
با استفاده از تابع animate می‌تونیم. به این شکل:

bigCircle.animate({r: 50}, 1000);

برای آرگومان اول صفت یا صفاتی رو قرار میدیم که قراره انیمیت بشن. که در بند بالا ما r یا همون شعاع رو برای این کار انتخاب کردیم.
آرگومان دوم هم زمان هست که بر حسب میلی‌ثانیه سنجیده می‌شه.
انیمیت به این صورت اتفاق میفته که شعاع دایره در عرض یه ثانیه از 150 به 50 تغییر می‌کنه.
نتیجه‌ی کار تا به اینجا رو می‌تونید دریافت کنید و ببینید.

تابع animate آرگومان‌های دیگه‌ای هم داره. برای مثال دوتا از اونا توابع easing و callback هستن.
توابع easing توابعی هستن که برای انیمیت کردن استفاده میشن. در اسنپ تابعی وجود داره به اسم mina که شامل انیمیت‌های از-پیش-آماده‌یی هست که برای سهولت کار در اختیار ما قرار گذاشته شدن. مثلن تابع elastic یکی از تابع‌های موجود در minaست و برای ما انیمیت کشسانی ایجاد میکنه. استفاده از mina به این صورته:

bigCircle.animate({r: 50}, 1000,mina.elastic);

میتونیم یه خط دیگه هم اضافه کنیم و توی اون روی y کار کنیم. صفت cy صفتیه که توی svg برای کار روی y استفاده میشه. پس به این صورت عمل می کنیم:

bigCircle.animate({cy: 200}, 1000,mina.bounce);

از تابع mina.bounce برای ایجاد انیمیتی مثل به زمین خوردن و بلند شدن توپ استفاده کنیم.

وارد کردن فایل svg
ما می‌تونیم فایل svg مورد نیاز خودمون رو وارد کنیم و باهاش کار کنیم. مثلن یه ابر. به این شکل عمل می‌کنیم:

Snap.load('img/cloud.svg', function (f){
	s.append(f);
});

و با خط زیر یه انیمیت هم بهش میدیم

var cloudsvg = s.select("#cloudsvg");
cloudsvg.animate({transform: "t" + (1500)}, 50000);

توی خط اول ما یه id سلکت کردیم، cloudsvg که اون رو توی فایل svgمون از قبل تعریف کردیم و در واقع idی ابرمونه.
توی خط بعد از تابع animate استفاده کردیم و می‌خوایم با خواصیت transform کار کنیم. اسنپ از تابع matrix برای اعمال انیمیت استفاده می کنه. پیشنهاد میدم این مقاله رو بخونید.
این که چرا t رو اینجا نوشتیم علتش اینه که توی اسنپ نماینده‌ی translate هست. البته هنوز توی داکیومنت اسنپ چیزی از این مخفف‌ها گفته نشده ولی با رجوع به فایل این قسمت رو دیدم:

if (command == "t" && tlen == 2){
    m.translate(t[1], 0);
} else if (command == "t" && tlen == 3) {
    if (absolute) {
        x1 = inver.x(0, 0);
        y1 = inver.y(0, 0);
        x2 = inver.x(t[1], t[2]);
        y2 = inver.y(t[1], t[2]);
        m.translate(x2 - x1, y2 - y1);
    } else {
        m.translate(t[1], t[2]);
   }...

توی گیت‌هاب میتونید بهتر متوجه این موضوع بشید.

با خوندن داکیومنت اسنپ و تسلط روی می‌تونید کارای خیلی جالبی انجام بدید.
در اینجا هم آموزش‌های ابتدایی‌ی سایت اسنپ رو می‌تونید ببینید.
این رو هم می‌تونید آزمایش کنید.

من با چیزایی که کار کردیم اینو درست کردم:

فایل‌ها رو می‌تونید از اینجا دریافت کنید و ببینید.
ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

رایانش مشبک تحت وب

امروز یک ایده به ذهنم رسید که نمی دونم واقعا مفید هست یا نه! یعنی واقعا در حد یه ایده ی خام هستش  و خیلی خیلی خیلی خوشحال می شم نظر بدید در موردش. دبیرستان که بودم یه پروژه دیدم تو سایت دانشگاه berkeley به اسم BOINC که داشتند روی Grid Computing کار می کردند و از […] ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

تست و دیباگ در جاوا اسکریپت

یکی از مهمترین قسمت‌های طراحی فاز test و debug است. اینکه روند اصلی کد در همه جا درست اجرا می شود؟ اینکه کلاً منطقی کد درستی نوشته اید؟ البته خیلی از javascript developer ها اینکار را نمی‌کنند و کار را خلاصه به console می‌کنند ولی آیا روش درستیست؟ نمی‌شود مطلقاً به این کار خرده گرفت ولی در نظر گرفتن چند نکته ضروریست
کدی که قابلیت test دارد با کد معمولی متفاوت است. برای اینکه قابل تست باشید تا جای ممکن نباید چیز جدید در end method ها استفاده کنید و همه چیز را از کسی که شما را call کرده‌اید بگیرید ولی معمولاً کد ها اینگونه نیست برای همین هنگام debug کردن اینکه کار کجا خراب شده است سختر می شود.

ادامه مطلب
ادامه مطلب