همیشه به خاطر داشته باشید Code Review ای که شما به عنوان یک Tech Lead یا Senior Developer خوب انجام میدهید موقعیت مناسبی است تا هم نقش خودتان را به عنوان Mentor برای اعضای تیم به خوبی انجام دهید و هم جریان انتشار دانش را در تیم تقویت کنید. و با بازخوردهای سازنده ای که به توسعه دهنده های تیم می دهید، به آنها در بهبود مهارت هایشان کمک کنید.
این مقاله هم میتواند برای Technical Team Lead (مدیر فنی) ها و Senior Developer ها مفید باشد تا شاخص هایی برای Code Review داشته باشند و هم برای Developer ها تا بدانند با رعایت کردن چه نکاتی میتوانند کد قابل قبول تری را تحویل بدهند.
در زمان بازبینی کد (Code Review) روی موارد کلیدی زیر تمرکز کنید:
Functionality
وقتی دارید Functionality کد را بررسی می کنید، مهمترین چیز این است که آیا این کد توانسته است تمام نیازمندی های مورد نظر را برطرف کند و همانطور که انتظار می رود اجرا شود.
برای این که بتوانید در این بخش موفق عمل کنید لازم است به موارد زیر دقت بیشتری داشته باشید:
1- نیازمندی ها را درک کنید.
فهم دقیق و شفافی از نیازمندی هایی داشته باشید که قرار است کد آنها را برطرف کند. این موارد هم شامل نیازمندی هایی میشود که به صورت واضح بیان شده است و هم انتظاراتی که مطرح کننده ی آن نیازمندی به صورت ضمنی مدنظر دارد.
2- با سناریوهای مختلف کد را تست کنید.
عملکرد و رفتارهای کد را در سناریوهای مختلف بررسی و تست کنید. ورودی های مختلفی را به برنامه بدهید و بخصوص برای شرایط مختلف موارد مرزی را تست کنید تا مطمئن شوید که کد میتواند در شرایط مختلف به درستی عمل کند.
3- شرایط مرزی را بررسی کنید.
به شرایط مرزی توجه ویژه ای داشته باشید این موارد شامل کمترین و بیشترین مقدار ها و امثال این ها می شود. بررسی کنید وقتی این شرایط مرزی پیش آمد، همچنان کد به درستی کار کند.
4- حواستان به سیستم های بیرونی باشد.
اگر کد با سیستم های بیرونی یا API ها کار می کند بررسی کنید که چطوری ارتباط با آنها و جواب های رسیده از سمت آنها را بررسی می کند. به ویژه بررسی کنید که آیا به درستی خطاها، قطع شدن ارتباط با سیستم بیرونی و تایم اوت گرفتن ها را مدیریت می کند یا خیر.
5- بخش های Concurrency و Multi-Threading را بررسی کنید.
اگر کد شامل بخش هایی است که به صورت Concurrency یا Multi-threading اجرا میشود، بررسی کنید که چطوری همزمانی (Synchronization)، race condition و بن بست (deadlock) های احتمالی را مدیریت میکند.
6- حواستان به تجربه ی کاربری باشد.
حواستان به تجربه ای که برنامه برای کاربر هدف خلق می کند باشد. شما باید دقت کنید که آیا کدتان بازخوردهای مناسبی را به کاربرنهایی می دهد به ویژه در مواقعی که می خواهد پیام صحیح، خطا و ... برگرداند.
وقتی با یک برنامه ی بزرگ مواجه هستید، توجه داشته باشید که درک صحیح از عملکرد کلی برنامه (حتی بخش هایی که به شما مربوط نمی شود) اهمیت زیادی دارد. و اگر درباره ی نیازمندی های کد، اطلاعات تان دقیق و شفاف نیست، به مستندات مراجعه کنید یا از دیگران بپرسید تا اطلاعاتتان تکمیل شود.
Readability یا خوانایی
در این بخش شما لازم است کد را از نظر اصول Clean Code بررسی کنید. این اصول باعث میشود کد نوشته شده توسط توسعه دهنده های تیم تان، خوانایی بالایی داشته باشد و در زمان انتقال به برنامه نویس های دیگر، رفع خطاهای احتمالی، ایجاد تغییرات و توسعه ی قابلیت های جدید، کار کردن بسیار راحت تر باشد.
برای افزایش Readability در کد، میتوانید در زمان Code Review به موارد زیر توجه کنید:
1. انتخاب نامهای معنادار برای متغیرها و توابع: استفاده از نامهایی که به وضوح هدف یا محتوای متغیر یا تابع را بیان میکنند.
2. تقسیم کد به توابع کوچکتر: این کار باعث میشود، کد قابل مدیریتتر و خوانایی آن بیشتر شود.
3. اجتناب از استفاده بیش از حد از دستور `else`: این کار میتواند به سادگی کد کمک کند و خوانایی آن را افزایش دهد.
4. دقت در استفاده از Indentation مناسب: Indentation مناسب به خوانایی کد کمک میکند و ساختار آن را واضحتر میسازد.
5. اجتناب از Comment های غیر ضروری: نظرات باید مفید و به اندازه باشند تا از ایجاد سردرگمی جلوگیری کنند.
6. جتناب از خطوط کد بسیار طولانی: نگه داشتن خطوط کد در طول معقول میتواند به خوانایی کمک کند.
7. ساختاردهی به کد: سازماندهی کد به گونهای که جریان منطقی داشته باشد و به راحتی قابل پیگیری باشد.
8. درخواست از توسعه دهنده ی تسک برای توضیح کد: این کار میتواند به شناسایی قسمتهایی که نیاز به بهبود خوانایی دارند کمک کند.
9. سادهسازی کد: هرچه کد سادهتر باشد، خوانایی آن بیشتر است.
Modularity
Modularity یکی از بازیگرهای اصلی در کیفیت و کارایی پروژه های نرم افزاری است. وقتی کدی Modularity خوبی دارد یعنی قابل استفاده مجدد است و می شود در جاهای مختلف از آن به راحتی بهره برد. هم چنین قابل نگهداری است. در نتیجه کیفیت برنامه را بالا برده و زمان و هزینه ی انجام کار را پایین می آورد. بهطور خلاصه، استفاده از Modularity نه تنها منجر به سادهتر شدن کدها میشود بلکه به توسعهدهندگان این امکان را میدهد تا تواناییهای خود را در حل مسائل پیچیده بهبود بخشند.
دقت داشته باشید که کدها در قطعه های قابل استفاده ی مجدد در جاهای دیگر و قابل نگه داری نوشته شده باشد. برای اینکه خیالتان راحت باشد که کد نوشته شده Modularity مناسبی دارد به موارد زیر دقت کنید:
- تفکیک وظایف و Single Responsibility: به این نکته توجه کنید که آیا هر ماژول یا تابع تنها یک کار خاص را انجام میدهد یا خیر. این نوع تفکیک نه تنها خوانایی کد را افزایش میدهد، بلکه در آینده به شما این امکان را میدهد تا تغییرات را در یک بخش بدون آسیب به سایر بخشها انجام دهید.
- استفاده از Interfaceها و APIها: یکی از نشانههای Modularity بالای کد، استفاده از Interfaceها و APIهاست. در زمان مرور کد، بررسی کنید که آیا ماژولها از طریق Interfaceهایی مشخص با یکدیگر در ارتباط هستند یا خیر. این کار، وابستگیها را کاهش میدهد و تغییرات در یک ماژول را بدون تاثیر بر سایر ماژولها ممکن میسازد.
- قابلیت استفاده مجدد: کد ماژولاری که قابلیت استفاده مجدد دارد، نشانهای از طراحی مناسب است. در طی کد ریویو، به این نکته دقت کنید که آیا توابع و ماژولها به گونهای طراحی شدهاند که بتوانند در بخشهای دیگر پروژه یا حتی پروژههای مختلف به راحتی مورد استفاده قرار گیرند یا خیر.
- سازماندهی مناسب: یکی دیگر از عوامل کلیدی در Modularity، سازماندهی مناسب فایلها و پوشهها است. بررسی کنید که آیا ساختار دایرکتوری به گونهای است که ماژولها به سادگی قابل شناسایی و دستیابی باشند.
- ارزیابی وابستگیها: در بررسی کد، به وابستگیهای بین ماژولها توجه کنید. آیا ماژولها خیلی به یکدیگر وابسته هستند؟ کاهش وابستگیها نه تنها منجر به Modularity بهتر میشود، بلکه نگهداری و تست کد را نیز آسانتر میکند.
- تستپذیری: ماژولهای کد باید به راحتی قابل تست باشند. اطمینان از اینکه هر ماژول بهطور مستقل قابل بررسی است، از ویژگیهای ضروری Modularity است.
Scalability یا مقیاسپذیری
زمانی که در حال Code Review هستیم، شناسایی مقیاسپذیری مناسب کد نوشته شده از اهمیت بالایی برخوردار است. این مورد در پروژههای بلندمدت و با حجم دادههای بالا به شدت حیاتی میباشد. حالا بیایید چند مورد اصلی که باید در این بخش مورد توجه قرار بگیرند را باهم بررسی کنیم:
- کارایی الگوریتمها: الگوریتمها باید با توجه به حجم دادههای ورودی عمل کنند. بررسی پیچیدگی زمانی (time complexity) و فضایی (space complexity) الگوریتمها میتواند به ما در درک بهتر مقیاسپذیری کمک کند. الگوریتمهایی با O(n^2) برای دادههای بزرگ معمولاً با مشکلاتی مواجه خواهند شد.
- Database Design (طراحی پایگاه داده): پایگاه داده باید به گونهای طراحی شود که از نظر مقیاسپذیری بتواند به راحتی افزایش load را تحمل کند. استفاده از تکنیکهایی مانند شاردینگ (sharding) و ایندکسگذاری (indexing) میتواند سرعت جستجو و دسترسی به دادهها را بهبود بیخشد.
- Caching Strategies (استراتژیهای کش): استفاده از کش (cache) میتواند بار روی سرور را کاهش دهد و سرعت پاسخدهی را افزایش دهد. بررسی مکانیزمهای کش مانند Redis یا Memcached و اینکه کجا از آنها استفاده شدهاند، نکته مهمی است.
- Load Testing: یکی از بهترین روشها برای ارزیابی مقیاسپذیری Load Testing است. با شبیهسازی شرایط مختلف، میتوان به نقاط ضعف کد پی برد و در صورت لزوم تغییرات لازم را اعمال کرد.
- Error Handling (مدیریت خطا): مدیریت خطا به طوری که سیستم بتواند در شرایط بار بالاتر به درستی عمل کند، اهمیت دارد. کدی که در شرایط خاص به خطا میافتد یا باعث کاهش کارایی میشود، نمیتواند به آسانی مقیاسپذیر باشد.
Performance
در فرآیند Code Review، یکی از وظایف اصلی بررسی عملکرد (Performance) کد نوشته شده است. در این بخش به جز مواردی که بالاتر به آنها اشاره شد مانند تحلیل پیچیدگی زمانی (Time Complexity)، بررسی پیچیدگی فضایی (Space Complexity) و استفاده از الگوریتمهای بهینه لازم است به دنبال گلوگاه ها (Bottlenecks) و جاهایی بگردید که به دلیل کدهای نامناسب و ناکارآمد ممکن است روی عملکرد سیستم تاثیر نامطلوبی داشته باشد. به طور کلی به این موارد دقت ویژه داشته باشید و به در کد به دنبالشان باشید:
شناسایی Bottlenecks:
گلوگاهها نقاطی در کد هستند که عملکرد کلی سیستم را کاهش میدهند. برای شناسایی آنها، مدتی را به پروفایل (Profile) کردن کد اختصاص دهید. ابزارهایی مانند Profilers و Performance Monitoring Tools به شما در شناسایی این نقاط کمک میکنند. البته با کسب تجربه بیشتر می توانید خیلی از این موارد را پیدا کنید. مانند جاهایی که درخواستهای بیش از حد به پایگاه داده زده میشود یا اجرای همزمان یا غیر همزمان بخش هایی از برنامه یا API هایی که عملکرد سنگینی دارند و load زیادی به سمت شان می آید.
بررسی کدهای تکراری و غیرضروری (Duplicate Code)
کدهای تکراری میتوانند مشکلاتی در زمینه عملکرد ایجاد کنند و همچنین نگهداری کد را دشوارتر میسازند. اطمینان حاصل کنید که کد به صورت DRY (Don’t Repeat Yourself) نوشته شده است.
استفاده از Cache
بررسی کنید که آیا از کش (Cache) به درستی استفاده شده است یا خیر. استفاده مناسب از کش میتواند به طور قابل توجهی زمان اجرای کد را کاهش دهد.
تست و Benchmarking
در نهایت، همواره باید کد را تست (Test) کرده و Benchmarking را انجام دهید. این کار به شما نشان میدهد که کد در شرایط واقعی چه عملکردی دارد و آیا نواقص بیشتری وجود دارد یا خیر.
Security
زمانی که Code Review می کنید، شناسایی مشکلات امنیتی یکی از وظایف اصلی شماست. در اینجا چند نکته کلیدی برای ارزیابی امنیت کد را مطرح میکنم:
- بررسی ورودیها (Input Validation)
پیش از هر چیز، توجه داشته باشید که کد شما چه نوع دادهای از ورودیها دریافت میکند. ورودیها باید به دقت اعتبارسنجی شوند. اطمینان حاصل کنید که:
- دادههای ورودی از سمت کاربر به درستی فیلتر و پاکسازی میشوند.
- از ورود دادههای غیرمجاز مانند SQL Injection و XSS جلوگیری میشود. - مدیریت دادهها (Data Management)
پس از بررسی ورودیها، نحوه مدیریت و پردازش دادهها نیز حائز اهمیت است. اطمینان حاصل کنید که:
- دادهها در فرمت مناسب ذخیره میشوند.
- از رمزنگاری مناسب برای ذخیره اطلاعات حساس استفاده شده است. - بررسی مجوزها و احراز هویت
هنگام بررسی کد به سیستمهای احراز هویت و مجوزها دقت کنید. اطمینان حاصل کنید که:
- کاربران فقط به منابعی دسترسی دارند که مجاز به دیدن آنها هستند.
- سطوح دسترسی به درستی تنظیم شدهاند. - استفاده از کتابخانهها و فریمورکها
مطمئن شوید که کد شما از کتابخانهها و فریمورکهای امن استفاده میکند. همواره آخرین نسخههای آنها را بررسی و بروز نگه دارید. - تست و مانیتورینگ
در نهایت، بررسی کد شما نباید محدود به گامهای قبلی باشد. تستهای امنیتی و مانیتورینگ مداوم از اهمیت بالایی برخوردارند:
- از ابزارهای تست نفوذ (Penetration Testing) برای شناسایی آسیبپذیریهای احتمالی استفاده کنید.
- عملکرد برنامه را تحت بار زیاد تست کنید تا مطمئن شوید که امنیت آن در شرایط فشار هم حفظ میشود.
ERROR HANDELING
زمانی که به عنوان یک Technical Team Lead، کدهای تیم خود را بررسی میکنید، یکی از جنبههای کلیدی که باید به آن توجه کنید، Error Handling (مدیریت خطا) است. مدیریت خطا نه تنها بر روی عملکرد نرمافزار تأثیر میگذارد بلکه تجربه کاربری (User Experience) را نیز تحت تأثیر قرار میدهد. در اینجا چند نکته برای بررسی مؤثر Error Handling آورده ام:
- استفاده از Exception Handling (مدیریت استثناء)
بررسی کنید که آیا برنامه از try-catch blocks به درستی و در همه جا استفاده میکند یا خیر. اطمینان حاصل کنید که استثناءها به درستی شناسایی و مدیریت میشوند. - ثبت خطاها
ایجاد لاگ (Log) برای خطاها بسیار ارزشمند است. اطمینان یابید که در هنگام بروز خطا، اطلاعات مهمی مانند نوع خطا، زمان بروز و محل آن ثبت میشود. این اطلاعات به تحلیل و رفع مشکلات کمک میکند. - پیامهای کاربرپسند
پیامهای خطا باید کاربرپسند و روشن باشند. به عنوان مثال، به جای نمایش پیامهایی مانند "Null Pointer Exception"، بهتر است پیامی ارائه دهید که کاربر را راهنمایی کند. - بررسی مسیرهای ممکن خطا
درخواستهای API و عملکردهای داخلی محل های حساسی برای بروز خطا هستند. اطمینان حاصل کنید که خطاهای احتمالی در این مسیرها به درستی ثبت و مدیریت شوند. - تست و موارد Edge Case (موارد خاص)
تستهای واحد (Unit Tests) و تستهای End-to-End باید شامل سناریوهای خطا باشند. اطمینان حاصل کنید که موارد Edge Case به درستی مدیریت شده و بررسی میشوند.
در نتیجه، سعی کنید در این بخش به عنوان یک Tech Lead بسیار حواستان به QA تیم باشد و شرایط را برای او فراهم کنید. زیرا او می تواند جاهایی که احتمالا از دست شما در رفته باشد را بیابد.
Documentation
در حین انجام Code Review، یکی از مهمترین مواردی که باید به آن توجه کنید، کیفیت Documentation (مستندات) است. مستندات نه تنها به فهم بهتر کد کمک میکند، بلکه در تسهیل همکاری میان اعضای تیم و همچنین کاهش زمان مورد نیاز برای یادگیری و درک کد تأثیرگذار است.
دقت داشته باشید که ما فقط مدیر کدها نیستیم، بلکه مدیریت مستندات هم از وظایف اصلی ماست.
در زیر لیستی از مواردی را داریم که خوب است در زمان کد ریویو مورد ارزیابی قرار بگیرد:
- وضوح و دقت (Clarity and Accuracy):
بررسی کنید که مستندات بهطور واضح و دقیق عملکرد کد را توضیح میدهند. هر تابع (function) یا ماژول (module) باید Comment ای مختصر و مفید از عملکرد خود داشته باشد. - تطابق با کد (Consistency with Code):
مطمئن شوید که مستندات با کدی که نوشته شده مطابقت دارد. اگر تغییراتی در کد ایجاد شده، باید مستندات نیز بروز شوند. - مستندهای مناسب:
انتظار میرود هر بخش از کد مستند مناسب خودش را هم بهمراه داشته باشد. برای مثال تصمیم های مهم و تغییرات بزرگ در کد حتما در قالب Decision Record مستند شود یا API ها مستندهای کاملی از ورودی ها و خروجی ها داشته باشند. - استفاده از استانداردها:
توجه داشته باشید که آیا مستندات از زبان و فرمت استاندارد (Standard Language and Format) پیروی میکنند یا خیر. رعایت این استانداردها به فهم بیشتر کمک خواهد کرد.
در آخر دقت داشته باشید که منظور از مستند، صرفا توضیحات فارسی و متن های طولانی نیست. از In-Line Comment ها تا سندهای Product Requirement Document (PRD) همگی مستنداتی هستند که لازم است در کد ریویو مورد ارزیابی دقیق قرار بگیرد.
Testing
یکی از مسئولیتهای کلیدی شما، اطمینان از کیفیت کد و همچنین مناسب بودن تستها (tests) است. در زمان Code Review، نکات زیر میتواند به شما کمک کند تا مطمئن شوید که تستها بهخوبی انجام شدهاند:
- انواع تستها لازم است
ابتدا مطمئن شوید که انواع مختلف تستها شامل Unit Tests ، Integration Tests و End-to-End Tests (تستهای همهجانبه) پوشش داده شدهاند. هر نوع تست وظایف خاص خود را دارد و وجود تمامی آنها برای اطمینان از کیفیت کد ضروری است. - Code Coverage
میزان Coverage (پوشش) تستها را بررسی کنید. حداقل 70-80% پوشش کد معمولاً نشانه خوبی است. اما این فقط یک معیار کمّی است و باید به کیفیت تستها و سناریوهای پوشش داده شده نیز توجه کنید. - Test Cases (موارد تست)
از توسعهدهندگان بخواهید که Test Cases (موارد تست) مشخص و متناسب با نیازهای پروژه بنویسند. این تستها باید از نظر جامع بودن و بررسی شرایط مرزی (edge cases) کافی باشند. - Automated Tests (تستهای خودکار)
اطمینان حاصل کنید که تستها بهطور خودکار اجرا میشوند. استفاده از CI/CD (ادغام مداوم / تحویل مداوم) میتواند به شما کمک کند تا هر بار که تغییراتی در کد ایجاد میشود، تستها بهطور خودکار اجرا شوند. - Documentation (مستندات)
مستندات تستها را بررسی کنید. وجود مستندات روشن در مورد نحوه عملکرد تستها و چگونگی اجرای آنها برای درک بهتر کیفیت تست بسیار مؤثر است. - Peer Reviews
یکی از بهترین راه ها، بررسی کدها و تست ها به صورت Peer Reviews هست. یعنی در تیم برنامه نویس ها به صورت ضربدری کدها و تست های هم دیگر را بررسی کنند.
Coding Standard
مطمئن شوید کدی که ریویو می کنید از استاندارد های کد نویسی و Best Practice هایی که در تیم تان درنظر گرفته اید به طور کامل تبعیت میکند. برخی از برترین استانداردهای کد نویسی که خوب است به آن دقت کنید عبارتند از:
DRY (Don't Repeat Yourself)
در این مورد ما باید حواسمان باشد که کد تکراری در برنامه نوشته نشود. با رعایت این استاندار کاهش خطا، افزایش قابلیت نگهداری و بهبود خوانایی کد را بدست می آورید.
KISS (Keep It Simple, Stupid)
هرجایی از کد که امکان دارد، به جای استفاده از راهحلهای پیچیده، از روشهای ساده و قابل فهم استفاده کنیم. کاهش زمان توسعه و Debug راحت تر و افزایش سرعت یادگیری برای توسعهدهندگان جدید از جمله مزایای رعایت این اصل است.
YAGNI (You Aren't Gonna Need It)
اگر ویژگی یا Feature غیرضروری در کدها وجود دارد، باید آن را حذف کنیم. توسعهدهندگان معمولاً تمایل دارند که قابلیتهای اضافی را تصور و در کد بگنجانند، که میتواند منجر به پیچیدگی غیرضروری گردد. با جلوگیری از این خطاها کاهش حجم کد و افزایش تمرکز بر روی نیازهای واقعی کاربران بست خواهد آمد.
4. SOLID Principles
کدی را که هر یک از این اصول پنجگانه رو رعایت نکردند، اصلا تایید نکنید تا بعدا مجبور نشوید چند برابر وقت صرف اصلاح خطاها بکنید
S: Single Responsibility Principle (اصل مسئولیت واحد)
O: Open/Closed Principle (اصل باز/بسته)
L: Liskov Substitution Principle (اصل جانشینی لیسکوف)
I: Interface Segregation Principle (اصل جداسازی رابط)
D: Dependency Inversion Principle (اصل وارونگی وابستگی)
با رعایت این اصول افزایش انعطافپذیری، قابلیت خوانایی و نگهداری راحت کد به دست می آید که واقعا ارزش سخت گیری در زمان کدریویو را دارد.
Avoid Side Effects
کدی که نوشته شده است نباید اثرات جانبی روی بخش های دیگر برنامه داشته باشد. برای بررسی این موضوع شما باید تسلط خوبی روی تمام بخش های کد داشته باشید.
Comment Your Code
توسعه دهنده ها باید در جاهایی که نیاز به توضیحات اضافی وجود دارد، کامنت بگذارند. اما توجه داشته باشید که کد باید خوانا باشد و نیاز به توضیحات گسترده نداشته باشد.
Open to Refactor
ریفکتور کردن (Refactoring) به معنی بهبود ساختار کد بدون تغییر در رفتار آن است. این کار به شما کمک میکند کد را مرتب و قابل فهم نگه دارید. پس در زمان Review ذهنتان برای ریفکتور کردن بخش هایی از کد که به این کار نیاز دارد باز باشد.
Design Patterns
استفاده از الگوهای طراحی (Design Patterns) مانند Singleton، Factory و Observer میتواند به شما در نوشتن کدی سازمانیافته و مقیاسپذیر کمک کند. خودتان به Design Patternها مسلط باشید و سعی کنید در زمان Review به این فکر کنید که آیا برای حل این مسئله Design Pattern ای وجود دارد یا خیر؟
Testing
تستنویسی (Testing) بخش جداییناپذیر از فرآیند توسعه نرمافزار است. نوشتن Unit Tests) و Integration Tests میتواند به شناسایی خطاها کمک کند و مطمئن باشید که برنامه به درستی کار میکند.
Consistent Style (سبک یکپارچه)
در زمان Review دقت کنید که تمام بخشی های برنامه از یک سبک یکپارچه پیروی کرده باشند. با رعایت این اصل کد قابل انتقالی به نفرات بعدی خواهید داشت.
شما هم اگر میتوانید موارد یا توضیحاتی به این لیست اضافه کنید که میتوانیم با رعایت کردن آن کد ریویو بهتری داشته باشیم را در کامنت ها باهامون به اشتراک بذارید.