PDA

View Full Version : باز هم مشکل در سه لایه نویسی



na3er-faraji
چهارشنبه 31 شهریور 1389, 11:13 صبح
در برنامه نویسی سه لایه گاهی پیش میاد که یک سری توابع داریم که در هر سه لایه لازم داریم؟اینا رو باید کجا نوشت؟؟؟ تو یک لایه اضافه؟؟ مثلا یک کلاس برای کار با تاریخ شمسی ؟؟؟

اَرژنگ
چهارشنبه 31 شهریور 1389, 11:45 صبح
در برنامه نویسی سه لایه گاهی پیش میاد که یک سری توابع داریم که در هر سه لایه لازم داریم؟اینا رو باید کجا نوشت؟؟؟ تو یک لایه اضافه؟؟ مثلا یک کلاس برای کار با تاریخ شمسی ؟؟؟
۱.چرا در هر ۳ لایه لازمه؟
۲.در لایه بی‌ال‌ال
۳. کلاس نوشته میشه با متدهایه مربوط، نه توابع.
۴.در دات نت فریم ورک تاریخ شمسی وجود دارد، به اندازه کافی هر کی یک روش من در آوردی برایه کار با تاریخ شمسی نوشته.

sayan
چهارشنبه 31 شهریور 1389, 11:45 صبح
سلام
بله شما باید یک قسمت مشترک بین تمام لایه هات ایجاد کنی مثلاً به اسم Common و تمام
متدها و کلاس هایی که بین تمام لایه ها مشترک هستند را آنجا قرار بدی.
در ضمن Refrence این لایه را به همه لایه هم باید بدی
این Common اسماً لایه است ولی واقعاً لایه شناخته نمی شود بلکه مکانی است که تمام شی هایی که در پروژه مشترک است قرار میگرند.

اَرژنگ
چهارشنبه 31 شهریور 1389, 11:54 صبح
سلام
بله شما باید یک قسمت مشترک بین تمام لایه هات ایجاد کنی مثلاً به اسم Common و تمام
متدها و کلاس هایی که بین تمام لایه ها مشترک هستند را آنجا قرار بدی.
در ضمن Refrence این لایه را به همه لایه هم باید بدی
این Common اسماً لایه است ولی واقعاً لایه شناخته نمی شود بلکه مکانی است که تمام شی هایی که در پروژه مشترک است قرار میگرند.
۱.به چنین چیزی لایه گفته نمیشه، یک کتابخانه (لایبراری) حساب میشه.
۲. common جایی که تازه کارها هر چیزی را میتونند بریزند توش به جایه اینکه از لایه و یا لایبراری استفاده کنند.

sayan
چهارشنبه 31 شهریور 1389, 12:08 عصر
بله آقا ارژنگ حرف آخر من هم همین بود

این Common اسماً لایه است ولی واقعاً لایه شناخته نمی شود بلکه مکانی است که تمام شی هایی که در پروژه مشترک است قرار میگرند.

na3er-faraji
چهارشنبه 31 شهریور 1389, 12:15 عصر
۱.چرا در هر ۳ لایه لازمه؟
۲.در لایه بی‌ال‌ال
۳. کلاس نوشته میشه با متدهایه مربوط، نه توابع.
۴.در دات نت فریم ورک تاریخ شمسی وجود دارد، به اندازه کافی هر کی یک روش من در آوردی برایه کار با تاریخ شمسی نوشته.

من خودم هم از PesianCalendar دات نت استفاده می کنم. اما خوب چتد تا تابع مینویسم و اون ها رو تو یک کلاس میزازم. منظورم همین بود که این کلاس کجا قرار بگیره؟؟؟ یا مثلا کلاسی برای رمز نگاری داده ها؟؟؟


بله شما باید یک قسمت مشترک بین تمام لایه هات ایجاد کنی مثلاً به اسم Common و تمام
متدها و کلاس هایی که بین تمام لایه ها مشترک هستند را آنجا قرار بدی.

آیا این روش استاندارده؟؟؟

na3er-faraji
پنج شنبه 01 مهر 1389, 09:20 صبح
آقا مگه نمیگن اعتبار سنجی باید تو لایه bll انجام بشه. یعنی ما نباید تو خود فرم دیگه اعتبار سنجی بکنیم.
1)مثلا یک دیتاگرید دارم که میخام یکی از سلولاش فقط عدد باشه. اعتبار سنجیش به چه شکله؟؟؟
2)واسه تاریخ هجری شمسی فرض کنید یک متد داریم که ماه و روز و سال رو میگیره تبدیل به تاریخ میکنه؟؟؟ همین متد رو کجا باید نوشت. چون بعضی مواقع تو لایه فرم نیازش داریم و بعضی مواقع تو لایه Bll???

اَرژنگ
پنج شنبه 01 مهر 1389, 09:52 صبح
آقا مگه نمیگن اعتبار سنجی باید تو لایه bll انجام بشه. یعنی ما نباید تو خود فرم دیگه اعتبار سنجی بکنیم.

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

در سطح فرم شما باید داده‌ها را کاربر بگیرید، و این داده‌ها باید به نوع داده‌ای که در بیزینیس لایر تعریف شده تبدیل بشند یا هم اینکه فقط به شکل تبدیل شده بشه واردشان کرد. برایه مثال برایه انتخاب تاریخ هم میشه از تکست باکس استفاده کرد و هم دیت‌پیکر . حالا اگر تکست باکس استفاده کنید اینکه چیزی که وارد شده یک تاریخ هست را باید بررسی کنید، اگر با دیت‌پیکر انتخاب بشه، میدونید که یک تاریخ انتخاب شده و احتیاجی به اعتبار سنجیش که تاریخ هست و یا نه ندارید.
حالا فرض کنیم این تاریخ انتخاب شده قرار است برایه روزه تولد به کار بره. در سطح فرم نباید چک بشه که این تاریخ در آینده نیست، بلکه اعتبار سنجیش در لایه بیزینیس انجام میشه.
حالا به این شکل میبینید که اعتبار سنجی انواع مختلف دارد، معمولاً وقتی که میبینید یکی میپرسه چطوری در تکست باکس فقط عدد وارد بشد در حقیقت لازم دارد که با یک عدد (مثلاً قیمت و سال ، ...) کار کند و نمیخواهد که اعتبار سنجی کند که اینکه یک چیزی که وارد شده عدد هست یا نیست ، در لایه بیزینیس قیمت یک کالا از جنس دسیمال فقط میتونه باشد، در لایه بیزینیس دیگر به اینکه یکی دارد کاراکترهایه غیره عددی را به عنوان قیمت قرار میخواهد بده اعتبار سنجی بشه، بلکه مثلاً اینکه قیمت کالا از قیمت خریده شدنش حداقل ۱۰٪ بیشتر باشد مهمه.



1)مثلا یک دیتاگرید دارم که میخام یکی از سلولاش فقط عدد باشه. اعتبار سنجیش به چه شکله؟؟؟
2)واسه تاریخ هجری شمسی فرض کنید یک متد داریم که ماه و روز و سال رو میگیره تبدیل به تاریخ میکنه؟؟؟ همین متد رو کجا باید نوشت. چون بعضی مواقع تو لایه فرم نیازش داریم و بعضی مواقع تو لایه Bll???

۱.اینکه چیزی که وارد شده عدد هست را در لایه فرم انجام داده میشه، چونکه بیزینیس ابجکت فیلدش عدد هست و نمیشه بهش یک رشته مقدار داده بشه.
ولی اینکه این عدد مابین ۱۰ و یا ۱۰۰۰ حتماً باید باشد در لایه بیزینس انجام میشه.
(مثلاً یک روش اینه که خود بیزینس ابجکت اکسپشن بندازه که اگر مقدار این نبود مقدار پروپرتی عوض نشد).
۲. چرا از دیت تایم پیکر فارسی استفاده نمیشه؟
چرا یک تاریخ را به ۳ قسمت که به هم ربطی ندارند تقسیم شده، کاربر ۳۱ اسفند هر سالی را نباید بتونه وارد کنه، پس اول باید اینکه مقادیر قابل انتخاب شدن صحت داشته باشند اعتبار سنجی بشه و این ربطی به برنامه شما ندارد.

na3er-faraji
پنج شنبه 01 مهر 1389, 10:52 صبح
چرا یک تاریخ را به ۳ قسمت که به هم ربطی ندارند تقسیم شده، کاربر ۳۱ اسفند هر سالی را نباید بتونه وارد کنه، پس اول باید اینکه مقادیر قابل انتخاب شدن صحت داشته باشند اعتبار سنجی بشه و این ربطی به برنامه شما ندارد.


public string WhatDay()
{
int iDayOfMonth = Calend.GetDayOfMonth(DateTime.Now);
int iMonth = Calend.GetMonth(DateTime.Now);
int iYear = Calend.GetYear(DateTime.Now);
string newData= iDayOfMonth.ToString() + "/" + iMonth.ToString() + "/" + iYear.ToString();
return newData;
}

منظورم این بود؟؟این تابع رو من هم لازم دارم که بعضی مواقع روی فرم مثلا روز جاری رو نشون بدم . هم بعضی جاها لازم دارم که تو لایه بیزینس بخونمش؟؟ باید تو لایه بیزینس بزارمش؟؟ اگه آره چطوری؟؟ یک کلاس واسش تعریف کنم؟؟؟

اَرژنگ
پنج شنبه 01 مهر 1389, 13:18 عصر
public string WhatDay()
{
int iDayOfMonth = Calend.GetDayOfMonth(DateTime.Now);
int iMonth = Calend.GetMonth(DateTime.Now);
int iYear = Calend.GetYear(DateTime.Now);
string newData= iDayOfMonth.ToString() + "/" + iMonth.ToString() + "/" + iYear.ToString();
return newData;
}

منظورم این بود؟؟این تابع رو من هم لازم دارم که بعضی مواقع روی فرم مثلا روز جاری رو نشون بدم . هم بعضی جاها لازم دارم که تو لایه بیزینس بخونمش؟؟ باید تو لایه بیزینس بزارمش؟؟ اگه آره چطوری؟؟ یک کلاس واسش تعریف کنم؟؟؟

۱.در لایه بیزینیس چرا به اینکه تاریخ به این فرمت باشد لازمه؟
۲.به جایه تابع نویسی، چرا به خصوصیات و متدهایه اشیای که باهاشان کار میکنید نمیندازید؟ به جایه اون کد
Custom Date and Time Format Strings
http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Standard Date and Time Format Strings
http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

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

na3er-faraji
جمعه 02 مهر 1389, 15:36 عصر
۱.در لایه بیزینیس چرا به اینکه تاریخ به این فرمت باشد لازمه؟

فرض کنید مثلا یک فرم ثبت نام کاربر داریم که یک سری مشخصات از لایه UI میاد و تو BLL باید تاریخ اضاف بشه و بره به لایه DAL برای ثبت در دیتابیس(تاریخ سیستم رو خودمون به تاریخ شمسی تبدیل می کنیم این عمل باید تو BLL انجام بشه دیگه درسته؟؟؟)

بعضی مواقع هم پیش میاد که لازمه تاریخ روز رو از میلادی به شمسی تبدیل کنیم و روی فرم نمایش بدیم؟؟؟

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


۲.به جایه تابع نویسی، چرا به خصوصیات و متدهایه اشیای که باهاشان کار میکنید نمیندازید؟
واسم مفهوم نبود جملتون. منظورتون اینه که تاریخ رو تو یه پراپرتی ذخیره کنم. اگه آره این پراپرتی کجا باید باشه؟؟؟


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

اون لایبرری باید کجا قرار بگیره؟؟؟ تو BLL . تو کلاس های موجود یا یک کلاس جدید؟؟؟


یا اینکه به شکل اکستنشن متدها به کلاسهایه موجود اضافه‌شان کنید.

راجع به اکستنشن متدها هیچ اطلاعاتی ندارم.

linux
جمعه 02 مهر 1389, 17:57 عصر
در برنامه نویسی سه لایه گاهی پیش میاد که یک سری توابع داریم که در هر سه لایه لازم داریم؟اینا رو باید کجا نوشت؟؟؟ تو یک لایه اضافه؟؟ مثلا یک کلاس برای کار با تاریخ شمسی ؟؟؟

شما یک فریم ورک می سازید برای اینکارها در همه لایه ها می توانید ازش استفاده کنید مثلا خود کلاسهای دات نت که در همه لایه ها می توانید استفاده کنید

na3er-faraji
جمعه 02 مهر 1389, 18:14 عصر
شما یک فریم ورک می سازید

منظورتون از فریم ورک یک لایه جداگانست ؟؟؟

linux
جمعه 02 مهر 1389, 22:13 عصر
منظورتون از فریم ورک یک لایه جداگانست ؟؟؟
دیگر اینجا بحث لایه نیست.
یک dll می سازید که تمام کدهایی که لازم دارید در هر سه لایه استفاده کنید در آن هست

na3er-faraji
جمعه 02 مهر 1389, 23:07 عصر
دیگر اینجا بحث لایه نیست.
یک dll می سازید که تمام کدهایی که لازم دارید در هر سه لایه استفاده کنید در آن هست
خود این dll کجا باید باشه؟؟؟ تو کدوم لایه؟؟؟

علیرضا حسن زاده
شنبه 03 مهر 1389, 07:50 صبح
خود این dll کجا باید باشه؟؟؟ تو کدوم لایه؟؟؟کلاس string که تو تمام لایه ها استفاده میشه مگه تو کدوم لایه تعریف شده!
همه چی که نباید تو لایه ها باشه یه اسمبلی دات نت درست می کنی توابعت رو توش می نویسی بعد هر کجا نیاز داشتی با یه رفرنس ازش استفاده می کنی. ربطی به لایه ها نداره