یکی از آسیب پذیری های خطرناک دنیای نرم افزار Race Condition هست . اما race condition چیه و چطور اتفاق میفته ؟
این آسیب پذیری زمانی رخ میده که دوتا عمل توی نرم افزار هم زمان رخ بدن اما برای اینکه نرم افزار درست کار کنه این دوتا عمل باید در زمان مناسب و به نوبت رخ بدن. یعنی اینکه این دوتا عمل جفتشون با یه قسمتی از رم کار دارن و همزمان شدنشون باعث این میشه که تاثیر بزارن رو هم که گاها تاثیرات بدی رو کل سیستم داره و هکر ها هم از این موضوع سوء استفاده میکنن
این مشکل که توی برنامه های مولتی ترد رخ میده اینطوریه که یه ترد از برنامه داره مثلا یه قسمتی از یه دیتای حساس رو میخونه و درحالی که هنوز میخونه و تمومش نکرده یه ترد دیگه از برنامه میاد اون دیتا رو آپدیت میکنه و عوضش میکنه
بزارید یه مثال بزنم تا این مسئله بهتر جا بیوفته . فک کنید با یه سیستم بانکی طرفید وقتی میخواید پولی به شخصی انتقال بدید سیستم اول میاد چک میکنه که شما تو حسابتون موجودی دارید یا نه اگه موجودی داشتید اول x مقدار پول به حساب طرف مقابل انتقال میده و بعد x مقدار از حساب شما کسر میکنه حالا فکر کنید اینجا یه race condition اتفاق بیوفته و دوتا درخواست انتقال با فاصله خیلی کم ثبت بشه اولی بیاد چک کنه ببینه موجودی دارید بعد پول رو به حساب طرف مقابل اضافه کنه و تا اون لحظه ای که پول از حساب شما کم میشه درخواست دوم هم بیاد و مرحله چک کردن موجودی رو رد کنه اینطوری شما پولی بیشتر از موجودیتون انتقال دادید
یکی از استفاده های معروف از این آسیب پذیری برمیگرده به سال 2015 که ایگر هوماکف ، متخصص امنیتی که تونست هرچند بار که میخواد حساب استارباکسش رو شارژ کنه بدون اینکه هزینشو پرداخت کنه (میتونید داستانش رو از اینجا بخونید)
یا همین چند وقت پیش که یه باگی تو openssh به وجود اومده بود و از همین آسیب پذیری استفاده میکرد
اگه میخواید بیشتر دربارش بخونید میتونید یه نگاهی به این مقاله ها بندازید
sokanacademy - techtarget - virgool
#security
@CleverDevs - @CleverDevsGp
این آسیب پذیری زمانی رخ میده که دوتا عمل توی نرم افزار هم زمان رخ بدن اما برای اینکه نرم افزار درست کار کنه این دوتا عمل باید در زمان مناسب و به نوبت رخ بدن. یعنی اینکه این دوتا عمل جفتشون با یه قسمتی از رم کار دارن و همزمان شدنشون باعث این میشه که تاثیر بزارن رو هم که گاها تاثیرات بدی رو کل سیستم داره و هکر ها هم از این موضوع سوء استفاده میکنن
این مشکل که توی برنامه های مولتی ترد رخ میده اینطوریه که یه ترد از برنامه داره مثلا یه قسمتی از یه دیتای حساس رو میخونه و درحالی که هنوز میخونه و تمومش نکرده یه ترد دیگه از برنامه میاد اون دیتا رو آپدیت میکنه و عوضش میکنه
بزارید یه مثال بزنم تا این مسئله بهتر جا بیوفته . فک کنید با یه سیستم بانکی طرفید وقتی میخواید پولی به شخصی انتقال بدید سیستم اول میاد چک میکنه که شما تو حسابتون موجودی دارید یا نه اگه موجودی داشتید اول x مقدار پول به حساب طرف مقابل انتقال میده و بعد x مقدار از حساب شما کسر میکنه حالا فکر کنید اینجا یه race condition اتفاق بیوفته و دوتا درخواست انتقال با فاصله خیلی کم ثبت بشه اولی بیاد چک کنه ببینه موجودی دارید بعد پول رو به حساب طرف مقابل اضافه کنه و تا اون لحظه ای که پول از حساب شما کم میشه درخواست دوم هم بیاد و مرحله چک کردن موجودی رو رد کنه اینطوری شما پولی بیشتر از موجودیتون انتقال دادید
یکی از استفاده های معروف از این آسیب پذیری برمیگرده به سال 2015 که ایگر هوماکف ، متخصص امنیتی که تونست هرچند بار که میخواد حساب استارباکسش رو شارژ کنه بدون اینکه هزینشو پرداخت کنه (میتونید داستانش رو از اینجا بخونید)
یا همین چند وقت پیش که یه باگی تو openssh به وجود اومده بود و از همین آسیب پذیری استفاده میکرد
اگه میخواید بیشتر دربارش بخونید میتونید یه نگاهی به این مقاله ها بندازید
sokanacademy - techtarget - virgool
#security
@CleverDevs - @CleverDevsGp
🔥26👍14⚡3
-اصل The Newspaper Metaphor در کلین کد
این اصل میگه که به یه روزنامه ای که خوب نوشته شده فکر کنید . شما از بالا شروع میکنید و تا پایین میخونیدیش .با خوندن عنوان مقاله می فهمید که اون صفحه در باره چیه و با خوندن پاراگراف اول هم یه خلاصه ای از محتوای صفحه میگیرید.
سورس کد هم تقریبا یه چیز مشابه به اینه شما با خوندن اسم فایل (یا حالا توی oop اسم کلاس) هدف کلی اون سورس فایل رو می فهمید قسمت های بالای کد که میتونه شامل توابع مهم یا متغیر ها و پراپرتی های مهم باشه (مثل پارگراف اول مقاله توی روزنامه) تا کسی که کد رو میخونه خلاصه ای از سورس دستش بیاد.
یه روزنامه شامل بخش های زیادیه که معمولا کوچیکن و در کنار هم با همچین شرایطی قرار گرفتنن تا روزنامه قابل خوندن باشه فرض کنید کل روزنامه فقط یه داستان یا مقاله بلند بود که خوندنش رو سخت میکرد سورس کد هم باید یه شرایط مشابهی داشته باشه تا قالب بندی خوبی داشته باشه یعنی فایل های مختلف با اسم درست و حسابی در کنار هم بیان و بدنه اصلی سورس کد کل برنامه رو بسازن
#CleanCode
@CleverDevs - @CleverDevsGp
این اصل میگه که به یه روزنامه ای که خوب نوشته شده فکر کنید . شما از بالا شروع میکنید و تا پایین میخونیدیش .با خوندن عنوان مقاله می فهمید که اون صفحه در باره چیه و با خوندن پاراگراف اول هم یه خلاصه ای از محتوای صفحه میگیرید.
سورس کد هم تقریبا یه چیز مشابه به اینه شما با خوندن اسم فایل (یا حالا توی oop اسم کلاس) هدف کلی اون سورس فایل رو می فهمید قسمت های بالای کد که میتونه شامل توابع مهم یا متغیر ها و پراپرتی های مهم باشه (مثل پارگراف اول مقاله توی روزنامه) تا کسی که کد رو میخونه خلاصه ای از سورس دستش بیاد.
یه روزنامه شامل بخش های زیادیه که معمولا کوچیکن و در کنار هم با همچین شرایطی قرار گرفتنن تا روزنامه قابل خوندن باشه فرض کنید کل روزنامه فقط یه داستان یا مقاله بلند بود که خوندنش رو سخت میکرد سورس کد هم باید یه شرایط مشابهی داشته باشه تا قالب بندی خوبی داشته باشه یعنی فایل های مختلف با اسم درست و حسابی در کنار هم بیان و بدنه اصلی سورس کد کل برنامه رو بسازن
#CleanCode
@CleverDevs - @CleverDevsGp
👍27❤5🔥5
جدیدا اومدم پست هایی که بلند هستن رو توی Obsidian مینویسم اولش بعد کپی میکنم تو تلگرام و میفرستم چنل که حس خوبیه بنظرم
همین که فضاش برای نوشتن یجورایی راحت تر از تلگرامه نوشتن توش حس خوبی داره
همین اینکه میتونم غیر از چنل یه جای دیگه هم آرشیوی از نوشته ها داشته باشم
از طرفی اگه احیانا اینترنت نداشتم یا یهو قطع شد هم باز مشکلی برای نوشتن توش وجود نداره
اگه دنبال یه برنامه یاداشت خوب هستید میتونید امتحانش کنید برای سیستم عامل های GNU/Linux - Windows - Macos - IOS - Android هم موجوده
https://obsidian.md/
#tools
@CleverDevs - @CleverDevsGp
همین که فضاش برای نوشتن یجورایی راحت تر از تلگرامه نوشتن توش حس خوبی داره
همین اینکه میتونم غیر از چنل یه جای دیگه هم آرشیوی از نوشته ها داشته باشم
از طرفی اگه احیانا اینترنت نداشتم یا یهو قطع شد هم باز مشکلی برای نوشتن توش وجود نداره
اگه دنبال یه برنامه یاداشت خوب هستید میتونید امتحانش کنید برای سیستم عامل های GNU/Linux - Windows - Macos - IOS - Android هم موجوده
https://obsidian.md/
#tools
@CleverDevs - @CleverDevsGp
👍27🔥7👎3⚡2❤1
Media Query
یه چیز باحال به CSS اضافه شده😂
مشخص کردن محدوده مدیا ها رو جای این:
@media (min-width: 320px) {}میتونیم اینجوری هم انجام بدیم:
@media (width >= 320px) {}#CSS SRC
@CleverDevs @CleverDevsGp
👍35🔥8❤6👌4
Built-In AI in your browser!
مثل این که کروم داره روی یه WebAPI جدید کار میکنه؛ هوش مصنوعی!
این WebAPI فعلا روی آخرین نسخه کروم قناری🐦 کار میکنه.
نمونه کد رو میتونید تو عکس ببینید.
#Js #Javanoscript #AI SRC
@CleverDevs @CleverDevsGp
1⚡20👍8👌4🆒3
CSS Logical Properties
یه بحثی هست به اسم پراپرتیهای منطقی که برای ما فارسی زبانها خوبه که بلدش باشیم. (چون فارسی از راست به چپه)
ما میتونیم جای جهتهای فیزیکی مثل چپ و راست از جهتهایی که بستگی به Rtl یا Ltr بودن HTML دارن استفاده کنیم؛ یعنی چی؟
یعنی مثلا جای
.box{
margin-right: 24px;
}از
.box{
margin-inline-end: 24px;
}استفاده کنیم.
// برای عمودی از block و افقی از inline استفاده میکنیم.
تو این حالت مهم نیست که سایت ما چپچینه یا راستچین، در هر صورت المنت بعدی با کلس box بیست و چهار پیکسل فاصله میگیره.
اما تو حالت اول اگه دایرکشن رو از چپ به راست به راست به چپ تغییر میدادیم باید یه همچین کدی هم اضافه میکردیم:
html[dir="rtl"] .box {
margin-right: 0;
margin-left: 24px;
}یسری پراپرتیهای دیگه که میتونن از این روش پیروی کنن:
text-align, inset, padding, border
#CSS SRC
@CleverDevs @CleverDevsGp
1👍34🔥7👌4⚡1
پارامتر های args* و kwargs** توی پایتون چی هستن ؟
توی پایتون ما علاوه برا پارامتر هایی که به طور معمول موقع تعریف تابع مشخص میکنیم دونوع پارامتر دیگه داریم که با ستاره مشخص میشن Non-keyword args و keyword args که پاس دادنشون موقع فراخوانی تابع الزامی نیست و آرگیومنت های اضافه ای که موقع فراخوانی تابع بهش پاس میدیم جای این پارامتر ها قرار میگیرن
اما چطور باید این پارامتر هارو تعریف کنیم و ازشون استفاده کنیم. فرض کنید ما یه تابع به اسم user داریم که به عنوان پارامتر اول آیدی میگیره و به عنوان پارامتر های بعدی یه سری دیتا بدون keyword مثلا اسم زبان های برنامه نویسی طرف و یه سری دیتا با keyword به عنوان اطلاعات شخصی طرف میگیره
حالا اگه این کد رو ران کنیم آیدی رو مثل یه پارامتر معمولی پرینت میکنه
بقیه آرگیومنت هایی که keyword ندارن میرن جزو langs که یه tuple هستش
و آرگیومنت هایی هم که که keyword دارن میرن جزو userinfo که یه dictionary هستش
و خروجی یه همچین چیزی میشه :
برای اینکه بیشتر دربارشون بخونید میتونید لینک زیر رو ببینید
https://www.geeksforgeeks.org/args-kwargs-python/
#python
@CleverDevs - @CleverDevsGp
توی پایتون ما علاوه برا پارامتر هایی که به طور معمول موقع تعریف تابع مشخص میکنیم دونوع پارامتر دیگه داریم که با ستاره مشخص میشن Non-keyword args و keyword args که پاس دادنشون موقع فراخوانی تابع الزامی نیست و آرگیومنت های اضافه ای که موقع فراخوانی تابع بهش پاس میدیم جای این پارامتر ها قرار میگیرن
اما چطور باید این پارامتر هارو تعریف کنیم و ازشون استفاده کنیم. فرض کنید ما یه تابع به اسم user داریم که به عنوان پارامتر اول آیدی میگیره و به عنوان پارامتر های بعدی یه سری دیتا بدون keyword مثلا اسم زبان های برنامه نویسی طرف و یه سری دیتا با keyword به عنوان اطلاعات شخصی طرف میگیره
def user(id,*langs,**userinfo):
print(id)
print(langs)
print(userinfo)
user(1,"php","python",name="Mammad",channel="CleverDevs")
حالا اگه این کد رو ران کنیم آیدی رو مثل یه پارامتر معمولی پرینت میکنه
بقیه آرگیومنت هایی که keyword ندارن میرن جزو langs که یه tuple هستش
و آرگیومنت هایی هم که که keyword دارن میرن جزو userinfo که یه dictionary هستش
و خروجی یه همچین چیزی میشه :
1
('php', 'python')
{'name': 'Mammad', 'channel': 'CleverDevs'}
برای اینکه بیشتر دربارشون بخونید میتونید لینک زیر رو ببینید
https://www.geeksforgeeks.org/args-kwargs-python/
#python
@CleverDevs - @CleverDevsGp
2👍32🔥8👌3⚡2
CleverDevs
سروران عزیزی که ... #fun #sql @CleverDevs - @CleverDevsGp
برای اینکه یروزی قیافتون شبیه این زبون بسته نشه، MySQL دستورات خیلی ساده ای داره که بصورت ایمن میتونید کارای خودتون رو انجام بدین و اگه از نتیجه راضی بودین تغییرات رو اعمال کنید، در غیر این صورت از تمامی دستورات استفاده شده صرف نظر میشه تا مشکلی در دیتابیس بوجود نیاد.
دستور شروع اعمال تغییرات:
و پس از اعمال تغییرات، اگر مایل به ذخیره آنها بودید از دستور زیر استفاده کنید:
و در غیر اینصورت، برای صرفنظر کردن از تغییرات اعمال شده از دستور زیر استفاده کنید:
#MySQL
@CleverDevs - @CleverDevsGp
دستور شروع اعمال تغییرات:
BEGIN;
و پس از اعمال تغییرات، اگر مایل به ذخیره آنها بودید از دستور زیر استفاده کنید:
COMMIT;
و در غیر اینصورت، برای صرفنظر کردن از تغییرات اعمال شده از دستور زیر استفاده کنید:
ROLLBACK;
#MySQL
@CleverDevs - @CleverDevsGp
2👍40🔥7👌2
Forwarded from Milad Nouri(ツ) میلاد نوری
طی نفوذی که به چند ربات ناشناس تلگرام اتفاق افتاده، متوجه شدند ۴۵۰ میلیون چت، ۱۱ میلیون عکس و ۳ میلیون ویدیو روی سرورهای این باتها ذخیره شده.
منبع: توییتر یاشو - مشاهده ویدئو
طی نفوذی که به چند ربات ناشناس تلگرام اتفاق افتاده، متوجه شدند ۴۵۰ میلیون چت، ۱۱ میلیون عکس و ۳ میلیون ویدیو روی سرورهای این باتها ذخیره شده.
منبع: توییتر یاشو - مشاهده ویدئو
2🤯52👍10😁7
Forwarded from Python Hints
تقریباً توی ۲ سال گذشته وقتی یکی بهم میگه:
واقعاً عصبیم میکنه.
من زمانی لینوکس رو یاد گرفتم که ۱ ماه منتظر موندم تا
چرا ؟
چون با اینترنت dial up + کارت اینترنت
۲ هفته صبر کردم نسخه جدید منتشر بشه، بعد سفارش دادم برام آوردن که ۲ هفته طول کشید.
وقتی cd به دستم رسید، یک کتاب قدیمی که از یک دانشجوی کارشناسی دانشگاه دستم رسیده بود رو نصفش رو خونده بودم و رو کاغذ تمرین کرده بودم.
انقدری که جای آیکون و آپشنها و ... رو حفظ شده بودم.
سیستم وقتی خراب میشد و توی کتاب نبود، بهترین گزینه این بود که تا ۱ شب صبر کنم چون از ۱ شب به بعد اینترنت dial up قویتر میشد (۶۴ کیلوبایت بود اون موقع) و میشد توی فرومهای مختلف راحتتر پستهارو دنبال کرد.
بعد شما الان به من میگی منبع نیست ؟ حتی اگر واقعاً هیچ منبعی هم وجود نداشته باشه برای دسترسی شما.
۱- داکیومنت اصلی
۲- سورس کدهای دیگران (یا حتی نویسنده اون کتابخونه، زبان برنامهنویسی یا ...)
۳- هوش مصنوعی
برای مثال من میخوام یک کتابخونه تو
bard.google.com
رو باز میکنم؛ توی اولین پیام مینویسم.
بعد شروع میکنم سورس کد دیگران رو خوندن، داکیومنت خوندن و کد زدن.
و هر کدی که متوجه نشم، یا حتی متوجه هم بشم برای درک بهتر و یا اینکه مطمئن بشم درست یاد گرفتم میدم به این مدل و ....
حالا چرا
۱- دسترسی به داده سرچ
۲- طول متن ورودی طولانیتر
۳- توضیحات دقیقتر
۴- کاملاً رایگان
توجه کنید ازش نمیخوام کد بزنه، میخوام بهم توضیح بده.
خلاصه که برای تنبلی خودتون، دنبال بهونه نباشید.
قطعاً این تکنیک زمانبر هست، اما پیشرفت نیاز به زمان داره.
گل سر سبد، آنچه باید رو بهتون گفتم دیگه
برای فلان موضوع منبعی وجود نداره، نمیتونم یاد بگیرم
واقعاً عصبیم میکنه.
من زمانی لینوکس رو یاد گرفتم که ۱ ماه منتظر موندم تا
CD نصب لینوکس به دستم برسه چرا ؟
چون با اینترنت dial up + کارت اینترنت
۵۰۰۰ تومانی امکان دانلود نداشتم.۲ هفته صبر کردم نسخه جدید منتشر بشه، بعد سفارش دادم برام آوردن که ۲ هفته طول کشید.
وقتی cd به دستم رسید، یک کتاب قدیمی که از یک دانشجوی کارشناسی دانشگاه دستم رسیده بود رو نصفش رو خونده بودم و رو کاغذ تمرین کرده بودم.
انقدری که جای آیکون و آپشنها و ... رو حفظ شده بودم.
سیستم وقتی خراب میشد و توی کتاب نبود، بهترین گزینه این بود که تا ۱ شب صبر کنم چون از ۱ شب به بعد اینترنت dial up قویتر میشد (۶۴ کیلوبایت بود اون موقع) و میشد توی فرومهای مختلف راحتتر پستهارو دنبال کرد.
بعد شما الان به من میگی منبع نیست ؟ حتی اگر واقعاً هیچ منبعی هم وجود نداشته باشه برای دسترسی شما.
۱- داکیومنت اصلی
۲- سورس کدهای دیگران (یا حتی نویسنده اون کتابخونه، زبان برنامهنویسی یا ...)
۳- هوش مصنوعی
برای مثال من میخوام یک کتابخونه تو
Rust یاد بگیرم و منبع هم نداره : bard.google.com
رو باز میکنم؛ توی اولین پیام مینویسم.
You are a senior Rust developer and my tutor on learning Axum, from now on you must help me understand every single line of code we will talk about.
بعد شروع میکنم سورس کد دیگران رو خوندن، داکیومنت خوندن و کد زدن.
و هر کدی که متوجه نشم، یا حتی متوجه هم بشم برای درک بهتر و یا اینکه مطمئن بشم درست یاد گرفتم میدم به این مدل و ....
حالا چرا
Bard یا همون Gemini رو استفاده میکنم ؟ ۱- دسترسی به داده سرچ
۲- طول متن ورودی طولانیتر
۳- توضیحات دقیقتر
۴- کاملاً رایگان
توجه کنید ازش نمیخوام کد بزنه، میخوام بهم توضیح بده.
خلاصه که برای تنبلی خودتون، دنبال بهونه نباشید.
قطعاً این تکنیک زمانبر هست، اما پیشرفت نیاز به زمان داره.
گل سر سبد، آنچه باید رو بهتون گفتم دیگه
3👍113🔥8❤7👌3👎2
محمد رضا حقیری ، برنامه نویسی ایرانی یه مدل زبانی توسعه داده که روی 400 میلیارد پارامتر train شده و عملکرد خوبی مخصوصا توی زبان فارسی داره
این پروژه رایگانه و اگه حمایت بشه همیشه رایگان میمونه
برای توضیحات بیشتر و گرفتن api به سایتش سر بزنید
https://jabirproject.org/
پ.ن یه ربات تلگرام زدم تا تستش کنم
#Ai #jabir
@CleverDevs - @CleverDevsGp
این پروژه رایگانه و اگه حمایت بشه همیشه رایگان میمونه
برای توضیحات بیشتر و گرفتن api به سایتش سر بزنید
https://jabirproject.org/
پ.ن یه ربات تلگرام زدم تا تستش کنم
#Ai #jabir
@CleverDevs - @CleverDevsGp
🔥78👍17💯7🤣2❤1👎1
همه میدونیم که مهمترین بخش یادگیری تمرینه؛
اگه ایدهای برای تمرین و زدن پروژه ندارید میتونید از اینجا صد تا پروژه مختلف رو ببینید و هر کدوم یهچیز خاص دارن که باید برید راجع بهش سرچ کنید.
لینک:
https://dev.to/bigsondev/100-free-frontend-challenges-3f0?ref=dailydev
#Tool
@CleverDevs @CleverDevsGp
اگه ایدهای برای تمرین و زدن پروژه ندارید میتونید از اینجا صد تا پروژه مختلف رو ببینید و هر کدوم یهچیز خاص دارن که باید برید راجع بهش سرچ کنید.
لینک:
https://dev.to/bigsondev/100-free-frontend-challenges-3f0?ref=dailydev
#Tool
@CleverDevs @CleverDevsGp
👍18❤10⚡4👌2
این آقا ستار هاشمی وزیر ارتباطات جدید کشوره.
ببینیم تو فحش خوردن میتونه رکورد جهرمی رو بشکونه یا نه
#News
@CeverDevs @CleverDevsGp
#News
@CeverDevs @CleverDevsGp
🤣105😁16👍8👌4👎2
یکی از بچه های چنل یه ریپازیتوری ساخته و داخلش درباره اینکه چطور توی hyperv*، لینوکس نصب کنیم و اسکریپت برای فعال کردن قابلیت های ویژه اش قرار داده.
تست کنید و اگه ایرادی داشت بگید.
*هایپر-وی برای دوستانی که نمیدونن:
یه هایپروایز نوع یک هست یعنی اینکه ماشین های مجازیتون مستقیما روی سخت افزارتون اجرا میشن و کاری به سیستم عاملتون(ویندوز) نداره و عملکردی خیلی بهتری نسبت به virtual box و vmware میده.
https://github.com/ali-hasehmi/LinuxVM-HyperV
#hyperv
@CleverDevs - @CleverDevsGp
تست کنید و اگه ایرادی داشت بگید.
*هایپر-وی برای دوستانی که نمیدونن:
یه هایپروایز نوع یک هست یعنی اینکه ماشین های مجازیتون مستقیما روی سخت افزارتون اجرا میشن و کاری به سیستم عاملتون(ویندوز) نداره و عملکردی خیلی بهتری نسبت به virtual box و vmware میده.
https://github.com/ali-hasehmi/LinuxVM-HyperV
#hyperv
@CleverDevs - @CleverDevsGp
👍24❤6🔥5
Good 🆚 Bad Refactor
وقتی یه پروژه رو میخوایم ریفکتور کنیم چیکارا نکنیم که وضع بدتر شه؟ (این پارت یکه.)
1. Don't Change The Base
بیس کد فعلی رو تا حد امکان تغییر ندید، صرفا شرایط فعلی رو بهتر کنید. مثال:
قبل:
function processUsers(users: User[]) {
const result = [];
for (let i = 0; i < users.length; i++) {
if (users[i].age >= 18) {
const formattedUser = {
name: users[i].name.toUpperCase(),
age: users[i].age,
isAdult: true
};
result.push(formattedUser);
}
}
return result;
}بعد از یه ریفکتور بد:
import * as R from 'ramda';
const processUsers = R.pipe(
R.filter(R.propSatisfies(R.gte(R.__, 18), 'age')),
R.map(R.applySpec({
name: R.pipe(R.prop('name'), R.toUpper),
age: R.prop('age'),
isAdult: R.always(true)
}))
);
بعد از یه ریفکتور خوب:
function processUsers(users: User[]): FormattedUser[] {
return users
.filter(user => user.age >= 18)
.map(user => ({
name: user.name.toUpperCase(),
age: user.age,
isAdult: true
}));
}توی ریفکتور اول بیس کد کلا تغییر کرد و از یه پکیج جدید استفاده شد و احتمال زیاد بقیه کسایی که تو پروژه هستن باهاش آشنایی ندارن و کار برای همه سخت میشه.
#CleanCode SRC
@CleverDevs @CleverDevsGp
👍26👌5🔥3❤2⚡2