Pure Coder
🔥چالش اگه یه معماری سه لایه ای داشته باشیم ✅Domain ✅Data souce ✅Presentation فرض کنید محصولات رو با قیمت دلاری شون توی دیتابیس ثبت کردید ولی موقع نمایش به کاربر باید اونو به واحد پولی کشور محل زندگی کاربر تبدیل کنید حالا توی یه یوزکیس میخوایم لیستی…
🔥چالش تبدیل پول ها بهم
برای تبدیل واحد های پولی به هم نیاز به دیتا داریم
برای مثال قیمت محصول به دلار توی دیتابیس ثبت شده و کاربر میخواد اون رو به ریال ببینه
دیتاهایی که اینجا لازمه یکی واحد پولی مورد نظر یا ثبت شده برای کاربر هست و یکی نرخ تبدیل دلار به ریال
برای فراهم کردن دیتا به دیتاسورس نیاز داریم
ولی به محض فراهم شدن دیتا, پروسه ی تبدیل توی Domain انجام میشه
پ.ن: منظورم از Domain سرویس ها(یوزکیس ها) نیستن.
توی این پروسه عناصر مختلفی درگیر میشن.
سرویس (یوزکیس) کار coordination بین دیتاسورس و Domain object ها رو انجام میده و دیتای مورد نیاز domain object ها رو از دیتاسورس میگیره و بهشون میده تا domain object ها کار تبدیل رو انجام بدن
این که اپ ما multi currency هست یه بحث بیزینسی هست و باید توی domain ساپورت بشه.
پرزنتیشن به هیچ عنوان وارد این پروسه نمیشه جز اینکه اطلاعات اماده و پردازش شده رو بگیره و نمایش بده.
پ.ن: از نظر تست, تبدیل باید توی دومین باشه تا راحتر بشه تستش کرد.
پرزنتیشن و دیتاسورس پروسه ی تست رو سختر و هزینه بر تر میکنن.
پ.ن: هر جای دیگه به جز دومین احتمال duplication رو بالا میبره (احتمالن تنها جایی که به تبدیل نیاز داریم این یوزکیس نباشه و موارد دیگه هم باشن )
@purecoder_ir
برای تبدیل واحد های پولی به هم نیاز به دیتا داریم
برای مثال قیمت محصول به دلار توی دیتابیس ثبت شده و کاربر میخواد اون رو به ریال ببینه
دیتاهایی که اینجا لازمه یکی واحد پولی مورد نظر یا ثبت شده برای کاربر هست و یکی نرخ تبدیل دلار به ریال
برای فراهم کردن دیتا به دیتاسورس نیاز داریم
ولی به محض فراهم شدن دیتا, پروسه ی تبدیل توی Domain انجام میشه
پ.ن: منظورم از Domain سرویس ها(یوزکیس ها) نیستن.
توی این پروسه عناصر مختلفی درگیر میشن.
سرویس (یوزکیس) کار coordination بین دیتاسورس و Domain object ها رو انجام میده و دیتای مورد نیاز domain object ها رو از دیتاسورس میگیره و بهشون میده تا domain object ها کار تبدیل رو انجام بدن
این که اپ ما multi currency هست یه بحث بیزینسی هست و باید توی domain ساپورت بشه.
پرزنتیشن به هیچ عنوان وارد این پروسه نمیشه جز اینکه اطلاعات اماده و پردازش شده رو بگیره و نمایش بده.
پ.ن: از نظر تست, تبدیل باید توی دومین باشه تا راحتر بشه تستش کرد.
پرزنتیشن و دیتاسورس پروسه ی تست رو سختر و هزینه بر تر میکنن.
پ.ن: هر جای دیگه به جز دومین احتمال duplication رو بالا میبره (احتمالن تنها جایی که به تبدیل نیاز داریم این یوزکیس نباشه و موارد دیگه هم باشن )
@purecoder_ir
اولین اولین اولین کدی که نوشتی چی بود؟
من👇
اولین کدم دستورهای
Write
Read
توی فرترن بودن که یه چیزی از کنسول میخوند یا توش چاپ میکرد
آنقدر هم بهم کیف داد که تا ۳ روز داشتم دوپامین ترشح میکردم 😂😂😂
@purecoder_ir
من👇
اولین کدم دستورهای
Write
Read
توی فرترن بودن که یه چیزی از کنسول میخوند یا توش چاپ میکرد
آنقدر هم بهم کیف داد که تا ۳ روز داشتم دوپامین ترشح میکردم 😂😂😂
@purecoder_ir
شرکت ها یا استارتاپ هایی که در ازای کار هیچ پولی بهتون نمیدن و در عوض بهتون قول سهام و ... میدن رو خیلی راحت زیر بارشون نرید ...
اولن به نتیجه رسیدن و شکوفا شدن یه استارتاپ به این راحتی نیست و درصد شکست خورده ها خیلی بیشتر از موفق هاست
دومن اینا آمروز پول ندارن و باهاتون مهربونن و معلوم نیست فردا روز چطوری بشن...
حتمن و تاکیدن منافع خودتون رو در نظر بگیرید و با این حرفا که برات رزومه میشه و ما مثل خانواده ایم و ... نرم نشید ( این حرفا رو میشنوی باید فرار کنی😂😂)
@purecoder_ir
اولن به نتیجه رسیدن و شکوفا شدن یه استارتاپ به این راحتی نیست و درصد شکست خورده ها خیلی بیشتر از موفق هاست
دومن اینا آمروز پول ندارن و باهاتون مهربونن و معلوم نیست فردا روز چطوری بشن...
حتمن و تاکیدن منافع خودتون رو در نظر بگیرید و با این حرفا که برات رزومه میشه و ما مثل خانواده ایم و ... نرم نشید ( این حرفا رو میشنوی باید فرار کنی😂😂)
@purecoder_ir
تایپ اسکریپت یعنی یه زبان استاتیک تایپه، ولی inheritance اش شبیه زبان های داینامیک تایپ کار میکنه و مجبوره که اینجوری باشه و این از معجزات شاهزاده جاوا اسکریپته که هر چی میان درستش کنن بازم از یه جایی در میره 😝😂😝😂😝
@purecoder_ir
@purecoder_ir
یکی از کمک هایی که رعایت SRP به سیستم میکنه توی پیدا کردن منشا اصلی باگ هست
وقتی یه باگی بوجود میاد شما باید در به در کدهارو اینور و اونور کنید تا سوراخ اصلی رو پیدا کنید و چسبش بزنید و رعایت SRP توی پیدا کردن هر چه سریعترش بهتون کمک میکنه
✅ رعایت SRP از فاکتورهای اصلی کاهش maintenance cost هست
@purecoder_ir
وقتی یه باگی بوجود میاد شما باید در به در کدهارو اینور و اونور کنید تا سوراخ اصلی رو پیدا کنید و چسبش بزنید و رعایت SRP توی پیدا کردن هر چه سریعترش بهتون کمک میکنه
✅ رعایت SRP از فاکتورهای اصلی کاهش maintenance cost هست
@purecoder_ir
عملکرد طبیعی مغز اینجوریه که وقتی یه چیز سخت رو برای بار اول میخوای یاد بگیری (از طریق مطالعه یا ....) یاد نگیره و براش گنگ باشه و گیج بشه
به خودتون زمان بدید
بار اول لازم نیست برید توی عمق یه مفهوم
بار اول فقط یه لایه ی نازک ایجاد کنید...خیلی خیلی خیلی نازک
بعد برآی چند روز رهاش کنید
توی این مدت مغزتون بدون اینکه متوجه بشید روش کار میکنه و باهاش کلنجار میره
بعد چند روز دوباره بیاید سراغش و ایندفعه یه لایه ی دیگه روی لایه قبلی ایجاد کنید
این کار رو به دفعات تکرار کنید تا درکتون عمیق و عمیق تر شه ...
یه مفهوم رو آنقدر بهش چنگ بزنید و خونیش کنید تا بالاخره به گوشتش برسید ولی توی پروسه زمانی خودش...
بعضی مواقع این پروسه زمانی به سال و حتا چند سال هم میکشه😳
@purecoder_ir
به خودتون زمان بدید
بار اول لازم نیست برید توی عمق یه مفهوم
بار اول فقط یه لایه ی نازک ایجاد کنید...خیلی خیلی خیلی نازک
بعد برآی چند روز رهاش کنید
توی این مدت مغزتون بدون اینکه متوجه بشید روش کار میکنه و باهاش کلنجار میره
بعد چند روز دوباره بیاید سراغش و ایندفعه یه لایه ی دیگه روی لایه قبلی ایجاد کنید
این کار رو به دفعات تکرار کنید تا درکتون عمیق و عمیق تر شه ...
یه مفهوم رو آنقدر بهش چنگ بزنید و خونیش کنید تا بالاخره به گوشتش برسید ولی توی پروسه زمانی خودش...
بعضی مواقع این پروسه زمانی به سال و حتا چند سال هم میکشه😳
@purecoder_ir
بعضی مواقع توی یادگیری یه موضوع هر چقدر هم که بری و برگردی و هر چقدر هم کلنجار بری، پیشرفت خیلی زیادی حاصل نمیشه و خرت توی گل گیر میکنه ..
اکثر مواقع به این دلیل هست که یا منبع مناسبی رو برای آموزش انتخاب نکردی و یا پیش نیاز ها رو رعایت نکردی و یهویی میخوای چند تا پله رو با هم بری بالا و نمیشه که نمیشه ...
باید بری و با حوصله پیش نیاز ها رو یاد بگیری و با یاد گیری پیش نیاز ها عرصه رو هر چه بیشتر بر موضوع مورد نظرت تنگ کنی تا بالاخره وقت موعود فرا برسه و گوشه ی رینگ گیرش بندازی و یادش بگیری 😍
عجله نکن و اول پایه ها رو یاد بگیر تا فرایند یادگیریت روال و بدون دست انداز بره جلو ...
@purecoder_ir
اکثر مواقع به این دلیل هست که یا منبع مناسبی رو برای آموزش انتخاب نکردی و یا پیش نیاز ها رو رعایت نکردی و یهویی میخوای چند تا پله رو با هم بری بالا و نمیشه که نمیشه ...
باید بری و با حوصله پیش نیاز ها رو یاد بگیری و با یاد گیری پیش نیاز ها عرصه رو هر چه بیشتر بر موضوع مورد نظرت تنگ کنی تا بالاخره وقت موعود فرا برسه و گوشه ی رینگ گیرش بندازی و یادش بگیری 😍
عجله نکن و اول پایه ها رو یاد بگیر تا فرایند یادگیریت روال و بدون دست انداز بره جلو ...
@purecoder_ir
چنتا قابلیت فوق العاده که توی زبان دارت هست و اونو متمایزش میکنه:
✅Factory
توی زبان هایی مثل جاوا و سی شارپ برای این منظور باید از static method ها استفاده کرد, factory ها خیلی خوب هدف رو بیان میکنن و اونو از بقیه static method ها متمایز و به کلین شدن کد کمک میکنن.
✅named constructor
هر چند که کلاس هایی که مفهوم بیزینسی دارن نباید چندتا constructor داشته باشن ولی این قابلیت در هر صورت یه امتیاز مثبت برای دارت محسوب میشه.
✅const constructor
بدون شرح.
✅Stream
اینکه به صورت built-in و اینقدر عالی از stream ها و Reactive programming پشتیبانی میکنه, جای هیچ حرفی رو باقی نمیگذاره.
@purecoder_ir
✅Factory
توی زبان هایی مثل جاوا و سی شارپ برای این منظور باید از static method ها استفاده کرد, factory ها خیلی خوب هدف رو بیان میکنن و اونو از بقیه static method ها متمایز و به کلین شدن کد کمک میکنن.
✅named constructor
هر چند که کلاس هایی که مفهوم بیزینسی دارن نباید چندتا constructor داشته باشن ولی این قابلیت در هر صورت یه امتیاز مثبت برای دارت محسوب میشه.
✅const constructor
بدون شرح.
✅Stream
اینکه به صورت built-in و اینقدر عالی از stream ها و Reactive programming پشتیبانی میکنه, جای هیچ حرفی رو باقی نمیگذاره.
@purecoder_ir
عیب بزرگ دارت در حال حاضر Reflection هست که خیلی وقت ها اذیت کننده هست و منجر به تولید کد جنریشن های مختلف و غیر قابل تحمل شده 🤦♂🤦♂
نه تنها برای فریمورک ها و پکیج ها، بلکه برای اپلیکیشن کد ها هم reflection یه قابلیت مهم هست که از کدهای تکراری و آزار دهنده جلوگیری میکنه
مزیتش برای فریمورک ها مخصوصن بک اند که دیگه غیر قابل انکار هست
برای مثال فریمورک خوب وانیا که توسط جواد زبیدی توسعه داده شده با وجود reflection به یه گزینه ی منحصر به فرد تبدیل میشد
البته مثل اینکه قراره به زودی این نقص برطرف بشه و در اینصورت انقلاب بزرگی توی دارت و فریمورک هاش (مثل وانیا) اتفاق خواهد افتاد
یکی دیگه از جاهایی که این نقص در حال حاظر اذیت کننده شده، توی تست ها هست که خیلی تست ها دارت رو نسبت به تست هایی که توی زبان های جاوا و سی شارپ و با JUnit و XUnit نوشته میشن، کثیف و زشت میکنه 🤦♂🤦♂🤦♂
@purecoder_ir
نه تنها برای فریمورک ها و پکیج ها، بلکه برای اپلیکیشن کد ها هم reflection یه قابلیت مهم هست که از کدهای تکراری و آزار دهنده جلوگیری میکنه
مزیتش برای فریمورک ها مخصوصن بک اند که دیگه غیر قابل انکار هست
برای مثال فریمورک خوب وانیا که توسط جواد زبیدی توسعه داده شده با وجود reflection به یه گزینه ی منحصر به فرد تبدیل میشد
البته مثل اینکه قراره به زودی این نقص برطرف بشه و در اینصورت انقلاب بزرگی توی دارت و فریمورک هاش (مثل وانیا) اتفاق خواهد افتاد
یکی دیگه از جاهایی که این نقص در حال حاظر اذیت کننده شده، توی تست ها هست که خیلی تست ها دارت رو نسبت به تست هایی که توی زبان های جاوا و سی شارپ و با JUnit و XUnit نوشته میشن، کثیف و زشت میکنه 🤦♂🤦♂🤦♂
@purecoder_ir
لینک گروه 👇
@purecoder_gp
✅سوالات و بحث های مربوط به Architecture، تست نویسی، OO، بکند، دات نت و فلاتر و ... رو میتونید توی این گروه مطرح کنید...
@purecoder_gp
✅سوالات و بحث های مربوط به Architecture، تست نویسی، OO، بکند، دات نت و فلاتر و ... رو میتونید توی این گروه مطرح کنید...
Forwarded from Fluttery's Journey
توی مثال جامع فصل 5 با Notification ها و inheritedWidget و Stateful و Stateless و RenderobjectWidget کار میکنیم...
یو ایش رو ایراد نگیرید😅
من توی UI داغونم😅😅😁
@fluttery_journey
@purecoder_support
یو ایش رو ایراد نگیرید😅
من توی UI داغونم😅😅😁
@fluttery_journey
@purecoder_support
Forwarded from Fluttery's Journey
کد سبد خرید که توی مثال جامع داریم
رسمن از فلاتر خارج شد و یه لحظه رفتم توی پوست اصلی خودم😂😂😂
@fluttery_journey
@purecoder_support
رسمن از فلاتر خارج شد و یه لحظه رفتم توی پوست اصلی خودم😂😂😂
@fluttery_journey
@purecoder_support
Pure Coder
کد سبد خرید که توی مثال جامع داریم رسمن از فلاتر خارج شد و یه لحظه رفتم توی پوست اصلی خودم😂😂😂 @fluttery_journey @purecoder_support
توی نام گذاری متد ها من اولین پارامتر متد رو هم جزو نام متد حساب میکنم(اگه امکانش باشه...نه همیشه)
نمیگم addProduct و اسمش رو میکذارم add و اولین پارامتر که اسمش product هست به اسم اضافه میشه موقع خوندن
یا نمیگم quantityOfProduct و میگم quantityOf و اولین پارامتر که product هست موقع خوندن به اسم اضافه میشه
یا نمیگم increaseQuantityOfProduct و میگم increaseQuantityOf و ...
@purecoder_ir
نمیگم addProduct و اسمش رو میکذارم add و اولین پارامتر که اسمش product هست به اسم اضافه میشه موقع خوندن
یا نمیگم quantityOfProduct و میگم quantityOf و اولین پارامتر که product هست موقع خوندن به اسم اضافه میشه
یا نمیگم increaseQuantityOfProduct و میگم increaseQuantityOf و ...
@purecoder_ir
اصل single responsibility رو میشه یه جاهایی نقض کرد و مشکلی هم پیش نیاد
زمانی که responsibility کلاس یا ماژولت خیلی چیز بزرگ و خاصی نیست میتونی responsibility دیگه ای هم گردنش بندازی
✅مهندسی نرم افزار از اول تا آخرش trade off هست و رادیکال بودن جواب نمیده و بدون trade off به هیچ عنوان نمیشه کاری از پیش برد و اصول ایده آل رو باید و باید و باید یه جاهایی نقض کرد ...منتها با آگاهی و علم و اشراف به داستان
@purecoder_ir
زمانی که responsibility کلاس یا ماژولت خیلی چیز بزرگ و خاصی نیست میتونی responsibility دیگه ای هم گردنش بندازی
✅مهندسی نرم افزار از اول تا آخرش trade off هست و رادیکال بودن جواب نمیده و بدون trade off به هیچ عنوان نمیشه کاری از پیش برد و اصول ایده آل رو باید و باید و باید یه جاهایی نقض کرد ...منتها با آگاهی و علم و اشراف به داستان
@purecoder_ir
🔥حلقه ها و ریاضی
حلقه ها توی برنامه نویسی ارتباط بسیار نزدیکی با مفهوم جایگشت (Permutation) و ترکیب (Combination) توی ریاضیات (احتمال) دارن.
برای مثال اگه بخوایم از بین n تا عدد 3 تا عدد مجزا انتخاب کنیم به صورتی که ترتیب شون اهمیتی نداشته باشه از کد زیر که سه تا حلقه ی for داره استفاده میکنیم:
که این کد دقیقن متناظر با مفهوم ترکیب توی ریاضیات هست.
حالا اگه ترتیب اهمیت داشته باشه (جایگشت) میتونیم از کد زیر استفاده کنیم
حتا ساده ترین حلقه ها توی برنامه نویسی هم که مینویسیم یه جورایی داریم از علم ریاضی استفاده میکنیم و اول کار این حلقه ها براساس همین الگو های علم ریاضی بوجود اومدن.
@purecoder_ir
حلقه ها توی برنامه نویسی ارتباط بسیار نزدیکی با مفهوم جایگشت (Permutation) و ترکیب (Combination) توی ریاضیات (احتمال) دارن.
برای مثال اگه بخوایم از بین n تا عدد 3 تا عدد مجزا انتخاب کنیم به صورتی که ترتیب شون اهمیتی نداشته باشه از کد زیر که سه تا حلقه ی for داره استفاده میکنیم:
var count = 0;
for (var i = 0; i < n; i++)
for (var j = i + 1; j < n; j++)
for (var k = j + 1; k < n; k++)
count++;
که این کد دقیقن متناظر با مفهوم ترکیب توی ریاضیات هست.
حالا اگه ترتیب اهمیت داشته باشه (جایگشت) میتونیم از کد زیر استفاده کنیم
var count = 0
for (var i = 0; i < n; i++)
{
for (var j = 0; j < n; j++)
{
if (j == i) continue;
for (var k = 0; k < n; k++)
{
if (k == j) continue;
if (k == i) continue;
count++;
}
}
}
حتا ساده ترین حلقه ها توی برنامه نویسی هم که مینویسیم یه جورایی داریم از علم ریاضی استفاده میکنیم و اول کار این حلقه ها براساس همین الگو های علم ریاضی بوجود اومدن.
@purecoder_ir
🔥تا حالا از Grpc به جای rest استفاده کردی؟
توی ریپوزیتوری زیر یه سرویس خیلی خیلی ساده که با Asp.net پیاده شده و برای یادگیری اولیه مفیده رو میتونی ببینی..
https://github.com/mohammadtaherri/ToDoGrpc
🔥از Grpc توی همه ی زبان های برنامه نویسی میتونی استفاده کنی و مهم نیست که کلاینت و سرور به چه زبانی نوشته شده باشن و با هر کلاینتی میشه به هر سروری متصل شد.
⭐️اگه برات مفید بود ستاره یادت نره
@purecoder_ir
توی ریپوزیتوری زیر یه سرویس خیلی خیلی ساده که با Asp.net پیاده شده و برای یادگیری اولیه مفیده رو میتونی ببینی..
https://github.com/mohammadtaherri/ToDoGrpc
🔥از Grpc توی همه ی زبان های برنامه نویسی میتونی استفاده کنی و مهم نیست که کلاینت و سرور به چه زبانی نوشته شده باشن و با هر کلاینتی میشه به هر سروری متصل شد.
⭐️اگه برات مفید بود ستاره یادت نره
@purecoder_ir
نام گذاری و قانون نام گذاری فیلد های دیتابیستون رو سعی کنید شبیه به domain model هاتون باشه
اگه پراپرتی های domain class هاتون رو با روش pascal case نام گذاری کردید، توی دیتابیس هم همین مدلی نام گذاری کنید اگه camel case استفاده کردید توی دیتابیس هم همین طور و ....
اگه فیلد Id رو توی مدل هاتون Id نام گذاری کردید یهویی توی دیتابیس از user_id و product_id استفاده نکنید و قبلش پیشوند نگذارید
سعی کنید یک زبان توی کل آپ حکم فرما باشه و نه چند زبان مختلف
@purecoder_ir
اگه پراپرتی های domain class هاتون رو با روش pascal case نام گذاری کردید، توی دیتابیس هم همین مدلی نام گذاری کنید اگه camel case استفاده کردید توی دیتابیس هم همین طور و ....
اگه فیلد Id رو توی مدل هاتون Id نام گذاری کردید یهویی توی دیتابیس از user_id و product_id استفاده نکنید و قبلش پیشوند نگذارید
سعی کنید یک زبان توی کل آپ حکم فرما باشه و نه چند زبان مختلف
@purecoder_ir
Pure Coder
نام گذاری و قانون نام گذاری فیلد های دیتابیستون رو سعی کنید شبیه به domain model هاتون باشه اگه پراپرتی های domain class هاتون رو با روش pascal case نام گذاری کردید، توی دیتابیس هم همین مدلی نام گذاری کنید اگه camel case استفاده کردید توی دیتابیس هم همین…
این قاعده نام گذاری رو سعی کنید توی json هایی که قراره بین آپ های مختلف transfer بشه (برای مثال کلاینت و سرور) هم رعایت کنید
نیاید json ای که قراره بین کلاینت و سرور رد و بدل بشه رو snake case کنید در حالیکه کلاینت و سرور جفتشون camel case یا ... هستن .
چرا این وسط تغییرات اضافی انجام بشه ؟
@purecoder_ir
نیاید json ای که قراره بین کلاینت و سرور رد و بدل بشه رو snake case کنید در حالیکه کلاینت و سرور جفتشون camel case یا ... هستن .
چرا این وسط تغییرات اضافی انجام بشه ؟
@purecoder_ir
Pure Coder
🔥سرفصل های کلی دوره ی Fluttery's Journey 1️⃣فصل اول با مباحث بیسیک که foundation ما برای ادامه ی ماجراجویی مون رو بنا میکنن, آشنا میشیم. از جمله : ✅مفهوم Event Loop در دارت ✅مفهوم Recursive Function ✅مفهوم Composite Pattern که توی فلاتر خیلی باهاش کار…
سلام دوستان
دوستانی که میخوان توی دوره ی فلاتر شرکت کنن ولی میخوان هزینه رو به صورت قسطی پرداخت کنن میتونن پیوی پیام بدن ...
@purecoder_support
✅تقریبن ۷ فصل دوره تکمیل شده و ۳ فصل از دوره باقی مونده
فصل بندی ها نسبت به چیزی که توی پست اعلام شده تغییر کرده ولی مباحث همون هست
در صورت سوال هم میتونید به آیدی بالا پیام بدید
دوستانی که میخوان توی دوره ی فلاتر شرکت کنن ولی میخوان هزینه رو به صورت قسطی پرداخت کنن میتونن پیوی پیام بدن ...
@purecoder_support
✅تقریبن ۷ فصل دوره تکمیل شده و ۳ فصل از دوره باقی مونده
فصل بندی ها نسبت به چیزی که توی پست اعلام شده تغییر کرده ولی مباحث همون هست
در صورت سوال هم میتونید به آیدی بالا پیام بدید
Pure Coder pinned «سلام دوستان دوستانی که میخوان توی دوره ی فلاتر شرکت کنن ولی میخوان هزینه رو به صورت قسطی پرداخت کنن میتونن پیوی پیام بدن ... @purecoder_support ✅تقریبن ۷ فصل دوره تکمیل شده و ۳ فصل از دوره باقی مونده فصل بندی ها نسبت به چیزی که توی پست اعلام شده تغییر…»