Pure Coder
786 subscribers
199 photos
37 videos
10 files
166 links
⭕️آدرس سایت:
https://purecoder.ir

⭕️گروه پرسش و پاسخ:
@purecoder_gp

⭕️پشتیبانی:
@PureCoder_support
@MohammadTaherri
Download Telegram
مهمترین اصلی که توی نام گذاری یه متد، variable یا ... باید رعایت کنیم اینه که در نهایت کدمون شبیه به یه story خونده بشه. یه جمله ی روون انگلیسی (Plain English )

🔥اگه قواعد گرامی ساده رو توی نام گذاری رعایت کنیم، نام های خیلی خوانا خواهیم داشت و خوندن کد خیلی ساده میشه.

🤦‍♂️بعضی مواقع این قواعد رو رعایت نمیکنیم و کار رو برای خودمون خیلی سخت میکنیم.

👈برای مثال وقتی یه کلاس user داریم و یه متدی داره که قراره یه bool ریترن کنه و بگه که email اش valid هست یا نه؟ باید در نظر بگیریم که این متد داخل یه if استفاده میشه.

حالا از بین جمله های زیر کدومش به انگلیسی روون نزدیکتره و راحتر خونده میشه؟

If user email is valid
If user is email valid
If user is valid email

مسلمه که جمله ی اول به انگلیسی روون نزدیکتره. پس بهتره اسم اون متد رو emailsValid بگذاریم.

🔥اگه این قاعده یعنی خونده شدن مثل یه جمله ی روون رو رعایت کنیم، خیلی جاها مشکلاتمون حل میشه. در این بین همچنین میتونیم بعضی جاها برای خوانا تر شدن کد از حروف تعریف مثل a, an, the استفاده کنیم و لزومی نداره که توی استفاده از اونها خساست به خرج بدیم.

پ.ن: پارادایم object oriented به تولید کدهایی که شبیه به یه جمله ی روون انگلیسی نوشته بشن و از قاعده ی زیر پیروی کنن کمک میکنه.

[subject] [action] [object]

@purecoder_ir
🔥8👍2
🔥asynchronous, multi threading
🆚Dart vs C#

🔥دارت و سی شارپ هر دو asynchronous هستن‌. البته توی سی شارپ هم میتونیم به صورت asynchronous کد بزنیم و هم غیر asynchronous.

یک برنامه ی asynchronous حتا در حالت single thread میتونه از یک برنامه ی multi thread که asynchronous نیست، بهینه تر عمل کنه‌.

سی شارپ به صورت پیش فرض یه محیط multi thread رو بهمون میده ولی دارت single thread هست.

پس توی سی شارپ اگه async کد بزنیم، میتونیم یه برنامه ی multi thread و asynchronous داشته باشیم و اگه async نزنیم یه برنامه ی multi thread معمولی داریم.

توی دارت کدهای بعد از await توی همون isolate ای اجرا میشن که کدهای قبل await اجرا میشدن. ولی توی سی شارپ ممکنه که کدهای قبل و بعد از await توی دو ترد مختلف اجرا بشن‌‌.

پس هر دو زبان با توجه به async بودن، بهینه عمل میکنن(البته به شرطی که ما کار رو خراب نکنیم)‌‌‌. در مقابل زبان سی شارپ با توجه به مولتی ترد بودن میتونه از حداکثر ظرفیت CPU استفاده کنه. ولی در عین حال همین مولتی ترد بودن چالش هایی رو به همراه داره که یک برنامه ی single thread باهاشون روبرو نمیشه. مثل shared memory که بین ترد ها اتفاق میوفته و همیشه باید حواسمون باشه که برنامه thread safe باشه. مخصوصن در محیط هایی مثل اپ های بکند که امکان همزمانی بشدت بالا میره‌. و چالش های دیگه ... .

کدوم یک بهترن؟

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

🔥توی هر دو زبان امکان این که خود دولوپر worker thread هایی رو اجرا کنه وجود داره که توی دارت با توجه به share نشدن memory بین ترد ها، بهشون isolate میگن.

سی شارپ علاوه بر این ترد هایی که خود دولوپر ممکنه ران کنه، یک thread pool داره و برای پردازش های خودش از ترد های این thread pool استفاده میکنه‌‌‌‌. دولوپر برای پردازش های خاص خودش میتونه یه ترد از thread pool قرض بگیره و یا یه ترد اختصاصی برای خودش بسازه که هر کدوم trade off های خوذش داره (قرض گرفتن یا اختصاصی ساختن). در مقابل زبات دارت تا وقتی که خودمون isolate ای نسازیم، single thread هست‌‌. از طرفی عمر isolate هایی که خودمون میسازیم هم کوتاهه و در کل میتونیم دارت رو single thread بدونیم. البته تاکید میکنم که به خاطر async بودنش و بلاک نشدنش موقع درخواست های IO، از محیط های multi thread و غیر async میتونه بهینه تر هم عمل کنه یا دست کم پا به پاشون حرکت کنه‌‌‌‌.

@purecoder_ir
🔥7👍4
کجا از async programming استفاده کنیم و کجا یه ترد دیگه ران کنیم؟

بستگی به تسکی داره که قراره انجام بشه.
تسک ها به دو دسته ی کلی تقسیم میشن:
☑️IO Bound
☑️CPU Bound

🔥دسته ی اول یعنی IO Bound اون هایی هستن که CPU خیلی توی سرعتشون تاثیر نداره و هرچقدر هم CPU قوی باشه توی سرعتشون تاثیر نمیگذاره. مثل network call یا خوندن یک فایل یا query زدن به دیتابیس و کارهایی از این دست.

IO = Input Output
input output operations

🔥دسته دوم یعنی CPU Bound تسک هایی هستن که CPU نقش تعیین کننده توی اون ها داره. مثل compress کردن یه ویدیو و یا حتا عملیات ساده ی جمع کردن دو تا عدد باهم.

اگه تسکی که داشتیم IO bound بود, مثل خوندن فایل, باید از async programming بهره ببریم تا در طول مدتی که اون درخواست درحال پردازش هست, ترد خودمون رو درگیر و بلاک نکنیم.

اگه تسکی که داشتیم, CPU Bound بود و البته سنگین بود, مثل compress کردن یه ویدیو, باید یه ترد دیگه ران کنیم و اونو توی اون ترد اجرا کنیم تا باز هم ترد اصلی خودمون رو درگیر اون پردازش سنگین نکنیم و از حداکثر توان CPU که به احتمال زیاد Multi Core هم هست استفاده کنیم.

🔥پس IO Bound ها معمولن با async await هندل میشن و CPU Bound های سنگین با ساختن ترد جدید.

@purecoder_ir
🔥9👍4
یکی از بزرگترین چالش های برنامه نویسی اینه که توی جاوااسکریپت this دقیقن به چی اشاره میکنه؟😂😂😂
🤣10👍1
This media is not supported in your browser
VIEW IN TELEGRAM
سیاوش شهشهانی، استاد ریاضی دانشگاه شریف:

انشا بیشتر از ریاضی به تقویت استدلال کمک میکنه!


واقعن چقدر مهارت کلیدی برای یه توسعه دهنده ی نرم افزاره!

@purecoder_ir
10
Pure Coder
سیاوش شهشهانی، استاد ریاضی دانشگاه شریف: انشا بیشتر از ریاضی به تقویت استدلال کمک میکنه! واقعن چقدر مهارت کلیدی برای یه توسعه دهنده ی نرم افزاره! @purecoder_ir
مهارت انشا نوشتن به اون معنا که توی ذهنمونه (انشا های مدرسه) برای توسعه دهنده ی نرم افزار ضروری نیست.

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

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

@purecoder_ir
🔥10👍1
Forwarded from Vania Dart Framework
آموزش ساخت سیستم عضویت ، ورود ، تایید ایمیل با ارسال ایمیل به وسیله فریم ورک وانیا

میتونید ویدیو رو توی یوتیوب مشاهده کنید

https://www.youtube.com/watch?v=8_K-1Cc4ufE
2
🔥Async Queue

همون طور که میدونیم صف ها یا Queue ها به صورت FIFO یعنی First in First out کار میکنن و دو متد معروف دارن:

☑️Enqueue
☑️Dequeue

با متد اول یک ایتم رو به ته صف اضافه میکنیم و با متد دوم یک ایتم رو از سر صف یا queue بیرون میکشیم و پردازش میکنیم.

کد بالا یک Async Queue هست.
به این صورت که متد Dequeue به حالت async در اومده.

await queue.Dequeue();

در نتیجه اگه ایتمی توی queue باشه, بلافاصله اون رو ریترن میکنه و اگه نباشه, هر موقع که یه ایتم جدید به queue اضافه شد, اون رو بهمون تحویل میده.

🔥به این صورت ترد های مختلف میتونن از این queue استفاده کنن و متد Dequeue رو کال کنن و اون رو await کنن و هر موقع که ایتمی به queue اضافه شد, اون ترد ها به نوبت در صف پردازش قرار میگیرن.

پ.ن: کد به زبان سی شارپ نوشته شده.

@purecoder_ir
🔥42
🔥51
ایا معماری هایی مثل کلین‌، هگزاگونال یا onion توانایی سوییچ کردن و تغییر دیتابیس مثل اب خوردن رو بهمون میدن؟ (برای مثال تغییر MySQL به MongoDb) (نظر خودت رو بگو، کوییز نیست!)(فرض بر پیاده سازی درست معماری هست)
Anonymous Poll
60%
آره
40%
نه
🔥41
به طور کلی دامنه ی تغییرات توی کدوم یک از لایه های زیر بیشتره؟(کوییز نیست، نظر و تحلیل خودت رو بگو)
Anonymous Poll
31%
Domain
50%
Application Service (Usecaee)
19%
Infrastructure (Data)
🔥3
آیا اصل Dependency Inversion توی زبان های داینامیک تایپ که چیزی به اسم اینترفیس ندارن هم مطرحه یا این اصل فقط یه مساله مربوط به زبان های استاتیک هست؟
Anonymous Poll
88%
آره، مطرحه و مهمه.
13%
نه، فقط مساله ی زبان های استاتیکه.
🔥3
🔥دارت جدید

// Use dot shorthand syntax on enums:
enum Status { none, running, stopped, paused }

Status currentStatus = .running; // Instead of Status.running

// Use dot shorthand syntax on a static method:
int port = .parse('8080'); // Instead of int.parse('8080')

class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0, y = 0; // Named constructor

// Factory constructor
factory Point.fromList(List<double> list) {
return Point(list[0], list[1]);
}
}

// Use dot shorthand syntax on a named constructor:
Point origin = .origin(); // Instead of Point.origin()

// Use dot shorthand syntax on a factory constructor:
Point p1 = .fromList([1.0, 2.0]); // Instead of Point.fromList([1.0, 2.0])

// Use dot shorthand syntax on a generic class constructor:
List<int> intList = .filled(5, 0); // Instead of List.filled(5, 0)


🙅‍♂من نظر خوبی در مورد این ویژگی ندارم.

@purecoder_ir
Forwarded from Books & Articles (Mohammad Taheri)
Clean_Code_A_Handbook_of_Agile_Software_Craftsmanship_Second_Edition.pdf
19.4 MB
ویراش دوم کتاب Clean Code.

باب مارتین، ۲۰۲۵.

🔥تغییرات زیادی نسبت به ویرایش اول داشته:
از اصول low level کلین کد،
تا اصول سالید و،
اصول طراحی component ها،
معماری کلین،
تست،
و حتا هوش مصنوعی،

توی این ویرایش صحبت شده.

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

@purecoder_ir
🔥91
This media is not supported in your browser
VIEW IN TELEGRAM
استفاده از واژه های انگلیسی در گفت و گو های روزمره وقتی که معادل فارسی زیبا داره، خیلی زشته. متاسفانه این زشتی گریبان بیشتر ماها رو گرفته...

@purecoder_ir
11👍3👌1
تصور اینکه ۶۰ سال پیش کدها شون رو روی یه سری punched card هک میکردن و هر پروژه ای شامل یه عالمه از این punched card ها بوده و سورس کد یه پروژه رو (ینی این کارت ها رو) توی کابینت یا کشو نگه میداشتن، و در کمتر از ۶۰ سال به این نقطه رسیدیم خیلی سخته‌‌‌.

(هر کارت یه خط برنامه رو در برمیگرفته و هر برنامه شامل تعداد خیلی زیادی از این کارت ها بوده که با یه دونه کش به هم میبستنشون تا گم و گور نشن.🤣 یعنی برنامت از نظر فیزیکی وزن زیادی داشته و برای حملش باید یه کامیون میگرفتی😂 )

فرض کن این کارت ها که هر کدوم شامل یه خط برنامه بودن از دستت ول میشدن و ترتیب کدها به هم میریخت.😂😂🤦‍♂🤦‍♂

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

جهان نرم افزار ترسناکه!!!

@purecoder_ir
😱8👌31👍1
قبل از Git سورس کنترل های مهم مثل subversion بر اساس ایده ی central repository کار میکردن. یه ریپوزیتوری مرکزی بود که همه بهش وصل میشدن.

ولی گیت ایده ی Distributed Source Control رو مطرح کرد.

یعنی قبلن اگه ۱۰۰ نفر روی یک پروژه کار میکردن، یه ریپوزیتوری مرکزی روی cloud بود که همه باید بهش متصل میشدن و روش کار میکردن و اون ریپو بود که نسخه ی معتبر پروژه بود.

قبل از subversion حتا cloud هم خیلی مطرح نبود.

ولی توی دنیای گیت اگه ۱۰۰ نفر روی یک پروژه کار کنن، همشون یه نسخه ی لوکال یا محلی برای خودشون دارن و همه ی این نسخه ها هم نسخه های معتبر پروژه هستن. درسته که یه ریپوزیتوری روی cloud هست. ولی این ریپو کمک میکنه که نسخه های لوکال به طور پیوسته باهم سینک یا همگام یشن. این به این معنی نیست که ا‌ون ریپویی که روی cloud هست از درجه ی اعتبار بالاتری نسبت به نسخه ی لوکال برخورداره. تمام نسخه هایی که توی تمام ماشین ها اجرا میشن از یک درجه ی اعتبار برخوردارن.

و این میشه ایده ی Distributed Source Control.


@purecoder_ir
🔥10👍1
برنامه نویس ها علاقه ی زیادی به reuse کردن کد دارن.

این علاقه باعث میشه که خیلی وقت ها دنبال این باشن که چند تا مفهوم (concept) رو generalize کنن و ازش یه base class تولید کنن که یه کدی رو به اشتراک میگذاره و بقیه کلاس ها ازش ارث بری میکنن ... .

خیلی وقت ها خیلی عجله میکنن و قبل از اینکه خود اون concept ها رو implement کرده باشن میخوان به زور ازش یه base class در بیارن. یعنی اول base class تولید میشه ‌ و بعد ... .

این عجله بیشتر وقت ها نتیجه ی خوبی نداره.

ابتدا باید هر concept به صورت جداگانه پیاده سازی بشه. صبر و تحمل به خرج بدیم و اجازه بدیم و اجازه بدیم و اجازه بدیم که اگه duplication واقعی بوجود اومد، اون موقع از قوه ی generilazation خودمون استفاده کنیم و یه base class استخراج کنیم.

ریفکتورینگ ابداع شده تا بتونیم صبور باشیم و هر کاری رو به موقع انجام بدیم و نه زودتر از موعدش.

@purecoder_ir
🔥13👍3
🔥4
🔥Configurations in .NET

توی دات نت میتونیم تنظیمات برنامه رو توی سطوح مختلف به برنامه پاس بدیم.

1️⃣appsettings.json
2️⃣appsettings.[Environment].json
👉appsettings.Development.json
👉appsettings.Production.json
3️⃣OS Environment variables
4️⃣Command Line Args

1️⃣پایین ترین سطح appsettings.json هست.

2️⃣بعد از اون تنظیمات مربوط به environment خاص هست. مثل
👉appsettings.Development.json
👉appsettings.Production.json

تنطیماتی که اینجا قرار میگیرن, تنظیمات appsettings.json رو در صورت تداخل اوراید میکنن.

3️⃣سطح بعدی قرار دادن تنظیمات توی environment variable های سیستم عامل هست که این ها هم تنظیمات دو سطح قبلی رو در صورت تداخل اوراید میکنن.
اینجا میتونیم تظیمات رو با استفاده از env var هایی که روی سیستم عامل یا داکر کانتینر ست میکنیم اعمال کنیم.

4️⃣اخری هم command line args هست که نسبت به همه اولویت بالاتری داره.

پس برای مثال اگه یه connection string رو توی appsettings گذاشته باشی و توی development ازش استفاده کنی, توی پروداکشن میتونی با env var ای که روی داکر ست میکنی اورایدش کنی.

پ.ن: این اولویت بندی و اوراید کردن توسط فریمورک انجام میشه و لازم نیست ما کاری انجام بدیم.

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

Configuration["ConnectionString:Default"]

🔥فرمت کانفیگ هایی که توی appsettings.json قرار میگیرن به صورت json هست:

{
"ConnectionString": {
"Default ": "...."
}
}

ولی موقع تنظیم کردن توی environment variable باید به این صورت عمل کنیم:

expose ConnectionString__Default = "..." // linux

setx ConnectionString__Default "..." //windows

اون __ کار nested object توی json رو میکنه!!!
توی داکر هم باید با همین فرمت تعریف بشن (__)

@purecoder_ir
🔥5👍2