PDA

View Full Version : راهنمایی در بهینه کردن کد



bftarane
سه شنبه 26 تیر 1397, 18:17 عصر
public List<tbl> SerchNewsByTitle(string title, int groupid)
{
try
{
var result = from n in tbl
where n.GroupId == groupid && n.Title.Contains(title)
select n;
if (groupid== -1)
{
result = from n in tbl select n;
}

return result.ToList();
}
catch (Exception e)
{
AddExceptionData(e);
return null;
}

}

mr.sirwan
سه شنبه 26 تیر 1397, 22:21 عصر
الان این کد واقعیتونه گذاشتین یا نمونه کده صرفا جهت تفهیم موضوع؟ اگه کد واقعیتونه، چن مورد وجود داره:
a. اولا اینکه شما اصلا جستجویی براساس title انجام ندادی
b. دوما فرض کنیم groupId برابر -1 بود، متد شما جفت کوئری رو اجرا میکنه، یعنی کوئری اول رو بدون بررسی هیچ شرطی اجرا میکنه بعد توی بدنه if چک میکنه که groupId برابر -1 هست؟ که بله برابر هست و دوباره یه کوئری دیگه هم اجرا میکنه که اینکار بی معنیه (البته منظورم از اجرا این نیست که داده ها رو واکشی کنه چون تا متد tolist فراخوانی نشه کوئری سمت دیتابیس اجرا نمیشه)

اما درمورد یکپارچگی، احتمالا منظور طرفتون این باشه که هر متد دقیقا باید کاری که براش تعریف شده رو انجام بده، یعنی الان تو این مثال شما، متد searchByTitle باید فقط داده هایی رو واکشی کنه که groupId براشون بزرگتر از -1 هست، و اون قسمت if رو کلا از این متد حذف کنین و براش یه متد بنویسین که تنها کاری که میکنه واکشی کل خبرها هست، و شما باید خارج از این دوتا متد چک کنین که آیا کاربر گروهی انتخاب کرده یا خیر، اگر گروهی انتخاب کرده بود، متد searchByTitle با groupId انتخاب شده اجرا بشه، در غیر اینصورت متدی که وظیفه واکشی کل خبرها رو داره اجرا کنین

bftarane
چهارشنبه 27 تیر 1397, 09:03 صبح
ممنون از راهنماییتون، نکات خوبی گفتید
نه کد واقعی نیست، برای تفهیم موضوع این کد رو گذاشتم
a. بله درست می گید،بیشتر چون تمرکزم روی اون -1 بود سرچ بر اساس تایتل رو فراموش کردم بزارم
b. بله مورد b به نظر خودم هم رسیده بود ولی نمی دونستم چطور باید این رو بهینه کنم



و شما باید خارج از این دوتا متد چک کنین که آیا کاربر گروهی انتخاب کرده یا خیر،
به جای اینکه وقتی گروهی انتخاب نشده از 1- استفاده کنم چه گزینه های دیگه ای می تونه وجود داشته باشه؟
چون ایشون تأکید داشتن که 1- قابل فهم و گویا برای دیگران نیست
آیا enum یا const جایگزین بهتری هستند؟

ممنون می شم اگه توضیحتون همراه با کد باشه، چون اون طوری قابل فهم تره

ali_md110
چهارشنبه 27 تیر 1397, 10:33 صبح
enum به مراتب بهتز از منفی یک هست
در ضمن میتونید دستورات شرطی که نیاز دارید را با اپراتور ؟ در بدنه where بکار ببرید

bftarane
چهارشنبه 27 تیر 1397, 15:28 عصر
در ضمن میتونید دستورات شرطی که نیاز دارید را با اپراتور ؟ در بدنه where بکار ببرید
بله این مورد انجام شده


public List<tbl> SerchNewsByTitle(string title, int groupid)
{
try
{
var result = from n in tbl
where (n.groupid == (groupid < 0 ? np.Fk_groupid: groupid)) && n.Title.Contains(title)
select n;
return result.ToList();
}
catch (Exception e)
{
AddExceptionData(e);
return null;
}

}

ولی هنوز راه حلی برای اجتناب از استفاده از 1- پیدا نکردم


enum به مراتب بهتز از منفی یک هست
امکانش هست به صورت شبه کد این رو بنویسید؟

mr.sirwan
چهارشنبه 27 تیر 1397, 15:53 عصر
شما که همچنان کدتون مثل قبله، بنده گفتم خارج از متد چک کنین که groupid برابر -1 هست یا نه؟ اگر بود، یه متد (مثلا GetAllNews) اجرا کنین که وظیفه واکشی کل رکورد هارو داره (یا هر مورد دیگه ای که خودتون مد نظر دارین) اگر مخالف -1 بود بیاد متد SearchNewsByTitle رو اجرا کنه

در ضمن شما اول نحوه تشخیص اینکه طرف گروهی انتخاب کرده یا نه رو بیان کنین تا روش خودتون رو پیش بگیریم و بگیم چجوری از enum استفاده کنین

bftarane
پنج شنبه 28 تیر 1397, 10:40 صبح
در ضمن شما اول نحوه تشخیص اینکه طرف گروهی انتخاب کرده یا نه رو بیان کنین تا روش خودتون رو پیش بگیریم و بگیم چجوری از enum استفاده کنین

در صفحه یک باتن قرار داره که با کلیک روی اون یک پاپ آپ باز میشه و گروه های اخبار در این پاپ آپ نمایش داده میشه، وقتی کاربر یک گروه رو انتخاب می کنه به صورت جاوااسکریپتی آی دی گروه در یک hidden field ریخته میشه و توسط jquery.ajax به متد پاس داده میشه
مقدار hidden field به طور پیش فرض 1- قرار دادم

<input type="hidden"
id="Fk_groupid" value="-1" />



$('#test').autocomplete({
serviceUrl: '/GetNews',
paramName: 'prefix',

onSearchStart: function (params) {
params.groupid = $("#Fk_groupid").val();

},

mr.sirwan
پنج شنبه 28 تیر 1397, 11:15 صبح
شما اون مقدار پیشفرض (value=-1) رو حذف کنین و سمت کنترلر برای اکشن GetNews پارامتر groupId رو null پذیر یا همون nullable کنین، و داخل بدنه اکشن به جای چک کردن -1، چک کن که آیا groupId برابر null هست یا خیر، نیازی به enum نیست، حالا من ساختار کد اکشنتون رو نمیدونم ولی تقریبا یه همچین چیزی:
public ActionResult GetNews(int? groupId)
{
if (groupId == null)
return GetAllNews();

return SearchNewsByTitle(groupId);
}

cmsdqq2
پنج شنبه 28 تیر 1397, 17:38 عصر
enum به مراتب بهتز از منفی یک هست
در ضمن میتونید دستورات شرطی که نیاز دارید را با اپراتور ؟ در بدنه where بکار ببرید


دوستان سلام

اینجا صحبت از دستورات شرطی و بهینه سازی کد شد، بنده هم سوالی داشتم.

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

شما ایده ای در مورد عدم استفاده از دستورات شرطی به صورت مستقیم در نظر دارید؟

بنده هنوز با مفهوم این موضوع آشنا نیستم. کمی مبهم هست.