تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 2 از 3 اولاول 123 آخرآخر
نمايش نتايج 11 به 20 از 25

نام تاپيک: Message In N_Tier

  1. #11
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    نقل قول نوشته شده توسط shotok
    اينکه تا چه حد اين موضوع به نظر و سليقه فرد بستگي داره و تا چه حد اصول دخيل هستند؟
    تولید چند لایه در واقع یک روش مفهومی مهندسی نرم افزار است که هیچ کلمه کلیدی ساختار مدون قطعی ندارد.

    هرچه پروژه بزرگ تر باشد و ارتبطات زیادتری داشته باشد (دیتابیس،سایت، شبکه، سخت افزارخاص و سرویس های ویندوزی و وبی و...)، بیشتر به سمتی پیش میرود که افراد مختلف لایه بندی های متفاوتی تشکیل دهند و البته ایراد خاصی هم ندارد.

    مهم رعایت آن تفکر اصلی است که به ایجاد گروه هایی از کلاس ها برای انجام وظیفه ای مشابه و عدم انجام کارهای متنواع در یک کلاس واحد اشاره دارد.

    مانند آنکه که خودتان هم به درستی اشاره کردید که یک لایه میانی حق ارتباط گیری مستقیم با کاربر یا دیتابیس را ندارد و باید وظیفه فوق را به گروه یا لایه مربوطه محول کند.


    منابع:
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

  2. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  3. #12
    پروفشنال
    تاريخ عضويت
    Nov 2007
    پست ها
    546

    پيش فرض

    بسم الله الرحمن الرحیم
    با سلام
    از استاد بزرگوار جناب _H2_ نهایت تشکر رو دارم و برای ایشان و تمامی _H2_هایی که با اخلاص علمشون رو در اختیار ما قرار میدهند آرزوی توفیق و سلامت دارم.
    سوالی دارم 2 رویکرد در این موضوع میتوان داشت:
    1) در هر لایه ای پیغام های مخصوص به خودش رو قرار بدهیم. ایراد این روش این است که نمی توان تغییر زبان UI را مدیریت کرد.
    2) پیغام را به لایه بالاترش بفرستیم و لایه بالاسری تصمیم گیری کند. ایراد روش ذکر شده این است که باید در لایه بالاتر دوباره کاری انجام شود. ( فرض بفرمائید بخواهیم با جزئیات مشخص کنیم که کدام استثنا رخ داده است.اگر استثنا1:آنگاه ... اگر استثنا2:آنگاه... و الی غیر)
    و به نظر میرسد مشکلی که در مورد Enum مطرح شده بود؛ تکرار شود.
    اگر Func1 خودش چند تابع دیگر را اجرا کند که هر کدام هم یک سری خطای عریض و طویل مخصوص خود را داشته باشند چه؟
    آنگاه حتماً باید enum نتیجه خروجی Func1 شامل جمیع enum های توابعی که صدا کرده باشد؟؟؟!
    افتضاح زمانی بالا میگیرید که آن چند تابع هم خودشان توابع دیگری را اجرا کنند...!
    با تمام این تفاسیر کدام روش مقرون به صرفه است.
    با سپاس فراوان

  4. #13
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    اول عضر خواهی میکنم چون باید اعتراف کنم که این تاپیک را کلاً فراموش کرده بودم و اگر شما تاپیک را فعال نکرده بودید معلوم نبود کی مجدد یادم بیاید... میبخشید...

    دوم در مورد سوالتان ...
    برای چند زبانه شما میتوانید یا از فایلهای resx خود دات نت استفاده کنید و یا یک مخزن XML ای از متون تشکیل دهید.
    به دلایلی استفاده از مستقیم از فایلهای XML مقبولیت بیشتری از فایلهای resx داشته (که البته آنها هم ذاتاً XML هستند...)

    هم میتوان کل این را در یک فایل واحد برای کل پروژه ذخیره کرد و هم میتوان آن را در قالب چند فایل مجزا دید، مثلاً یک فایل XML برای هر لایه و حتی یک فایل XML برای پیام های مشترک در تمام لایه ها و...
    برنامه به سادگی میتواند زمان بالا آمدن تمام این فایلها در یک Dictinary بارگذاری کند که در تمام لایه ها در دسترس باشد.
    این دیکشنری میتواند شامل کلیه پیام های خطا و هشدار و موفقیت و نام دکمه ها و برچسب ها و... باشد.

    این فایل یا فایلهای XML هم میتواند داخل exe باشد و هم (چه بهتر) در خارج از برنامه و کنار Exe باشد.
    (تا هر کسی از روی نسخه انگلیسی و بدون کمترین دانش برنامه نویسی بنواند آن را به زبان خودش ترجمه کند)

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

  5. #14
    پروفشنال
    تاريخ عضويت
    Nov 2007
    پست ها
    546

    پيش فرض

    بسم الله الرحمن الرحیم
    با سلام
    از پاسختون بینهایت ممنون.
    لطفا راجع به مطلبی هم که در مورد دیکشنری فرمودید بیشتر توضیح بدید.
    متاسفانه هنوز متوجه نشدم که:
    1) در هر لایه ای پیغام های مخصوص به خودش رو قرار بدهیم؟ ایراد این روش این است که نمی توان تغییر زبان UI را مدیریت کرد.
    یا
    2) پیغام را به لایه بالاترش بفرستیم و لایه بالاسری تصمیم گیری کند؟ ایراد روش ذکر شده این است که باید در لایه بالاتر دوباره کاری انجام شود. ( فرض بفرمائید بخواهیم با جزئیات مشخص کنیم که کدام استثنا رخ داده است.اگر استثنا1:آنگاه ... اگر استثنا2:آنگاه... و الی غیر)
    و به نظر میرسد مشکلی که در مورد Enum مطرح شده بود؛ تکرار شود.
    می بخشید دوباره سوالم رو تکرار کردم.
    با سپاس فراوان

  6. #15
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

  7. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  8. #16
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    میبخشید دیر شد طبق معمول مشکلات الوان تمامی ندارد...

    یک نمونه فوق العاده بچه گانه درست کردم...
    خیلی ساده است و خیلی از اصول عالی را رعایت نکرده است.
    ولی نمونه مخزن متن های xml و خطای چند زبانه را دارد.
    کد خیلی خیلی کم بیش از ترجمه xml ای صرف دیده شده و چند کلاس و اینترفیس اضافه برای کمی نزدیک شدن به پروژه های واقعی را هم دارد...


    برای ترجمه و آرشیو xml از یک dll از خودم استفاده کردم تا سرعت تولید را کاهش دهم ...
    دوستان میتوانند خودشان یک فهرست و مفسر xml به پروژه اضافه کنند...


    در پروژه جاری فایل های ترجمه در قالب فایل xml جداگانه و در پوشه Localization در بیرون برنامه قرار دارد.
    برنامه قابلیت ادغام xml ها را دارد به این معنی که میتوان یک xml را به چند فایل xml بشکنید، برنامه خودکار زمان بالا امدن همه آنا را به نوعی در حافظه merge میکند.
    کلید ادغام عدد فرهنگ زبان LCID است.
    مثلاً فایل زیر:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    میتواند به دو فایل مستقل زیر شکسته شود.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    و
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    در نتیجه انتخاب آنها متن های هر لایه یا گروه یا فرم یا بخش و... در یک فایل xml مستقل باشد یا اینکه کل پروزه یک فایل xml واحد داشته باشد به عهده خودتان است و نیاز به تغییر یک خط از کدها هم ندارد.

    دقت کنید در محیط VS (به دلیل ریست تنظیمات) شاید combobox ای که زبان برنامه را تغییر میدهد شاید دفعه اول کار نکند ولی اگر نمونه exe را مستقیماً اجرا کنید متوجه میشوید مشکلی وجود ندارد.

    بررسی کنید مشکلی بود روی معیار همین پروژه بحث میکنیم.

    با کمی تغییرات امکان ذخیره xml ها درون خود dll ها و exe ها هم وجود دارد.

    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    موفق باشید.

  9. #17
    پروفشنال
    تاريخ عضويت
    Nov 2007
    پست ها
    546

    پيش فرض

    بسم الله الرحمن الرحیم
    با سلام
    قبل از هر چیز از اینکه وقت گذاشتید و نمونه برنامه رو حاضر کردید بینهایت ممنون؛ سپاسگزارم.
    دقت کنید در محیط VS (به دلیل ریست تنظیمات) شاید combobox ای که زبان برنامه را تغییر میدهد شاید دفعه اول کار نکند ولی اگر نمونه exe را مستقیماً اجرا کنید متوجه میشوید مشکلی وجود ندارد.
    کل برنامه اجرا نمی شود خطای زیر رو میده.
    a project with an output type of class library cannot be started directly. in order to debug...
    چون میخواهم برنامه رو خط به خط اجرا بگیرم برام مهمه که در محیط VS اجرا بگیرم ولی فایل exe به خوبی کار میکنه.
    حدود یک ربع به این برنامه به قول خودتون بچه گانه زل زدم ولی کلیت کار دستم نیومد
    جسارت بنده رو ببخشید ولی لطفا توضیحات بیشتری در مورد برنامه بفرمائید.
    خیلی وقته که منتظر این برنامه بودم بنابراین نمی تونم به راحتی ازش بگذرم.
    ببخشید که وقتون رو میگیرم.
    ان شاالله تا شما جواب میدید بازهم خودم تلاش میکنم تا ابهاماتم رو مرتفع کنم.
    پیشاپیش تشکر میکنم.
    Last edited by shotok; 18-12-2012 at 14:31.

  10. #18
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    کل برنامه اجرا نمی شود خطای زیر رو میده.
    a project with an output type of class library cannot be started directly. in order to debug...
    در solution هایی که شامل بیش از یک project هستند، فقط و فقط یک پروژه را باید به عنوان startup مشحص کنید.
    این پروژه آغاز کننده معمولاً نامش در solution explorer به صورت bold شده نشان داده میشود.

    در حال حاضر دررایانه شما با این پروژه صفر کیلومتر، یکی از dll ها به عنوان startup قرار گرفته که قابل اجرا نیست.
    مشابه آن است که بخواهید با دبل کلیک یک dll برنامه را اجرا کنید ... !


    کافیست روی پروژه اصلی exe در solution explorer راست کلیک کنید و گزینه startup را فعال کنید.
    VS این تنظیم را برای solution در قالب یک فایل مخفی جداگانه ذخیره خواهد کرد و در دفعات بعد آن را حفظ خواهد کرد.

    لطفا توضیحات بیشتری در مورد برنامه بفرمائید
    پروژه در مسخره ترین حالت ممکن است.
    این را میگویم تا هم به خودتان مطمئن تر شوید و هم چون به قطع در آینده بدلیل عدم رعایت مستحکم تر برخی اصول به جاهایی از این پروژه خواهید خندید...

    4 پروزه داریم...
    PublicLibrary به عنوان کتابخانه عمومی است که به تمام لایه های دیگر سرویس های خلی کلی و عمومی را ارائه میدهد...
    مثلاً میتواند شامل تعریف خالی بدنه interface ها باشد...
    میتواند شامل تعریف کلاس های static حاوی توابع عمومی باشد ... توابه کمکی LINQ ... توابع کمکی ریاضی مثل factorial ... توابع محاسباتی ... توابع پردازش string ... و..و...و...
    وجود این لایه در معماری سرویس گرایی خیلی مهم تر خواهد شد...

    DatabaseLayer
    لایه دیتابیس که فعلاً بجز به جریان انداختن یک Exception چند زبانه کار دیگری انجام نمیدهد.

    KernelLayer
    لایه هسته مرکزی که فرض شده ماژول ها و سرویس های مختلفی را زمان بالا آمدن برنامه به جریان خواهد انداخت...
    بطرز خیلی بچه گانه ای کلاس ساده Kernel.Application ، معرف بارگذاری این لایه و کلاس اصلی آن است که مسئول بارگذاری سایر خدمات این لایه است، همچنین در صورت لزوم نابود سازی این خدمات در زمان بسته شدن برنامه برعهده دارد...

    در یک طراحی عالی میتوان کاری کرد که ضمن انجام اکثر پردازش های برنامه در این لایه، ولی تمام کلاس های این لایه به صورت خصوصی باشند و کلاً خارج از دسترس مستقیم تمام لایه های دیگر باشد و نیازی هم به فراخانی مستقیم انها از لایه های دیگر نباشد .... شاید الآن کمی گفته هایم نا معقول بنظر برسد ولی به آن فکر کنید ... ... ... ...

    کلاس StringResourceModule در این لایه مسئول اصلی بارگذاری xml های زبان است که برای این کار کمی از پارسر و دیکشنری داخل ghdiamond کمک گرفته ...
    توجه کنید که به عنوان مثال به جای new کردن مستقیم این کلاس در لایه exe .... آمده ام و در لایه exe کلاس اصلی Kernel.Application را نمونه سازی کرده ایم و این کلاس آمده و کل مکانیزم هالی موجود در لایه kernel را برای ما در حافظه بارگذاری کرده که از البته فعلاً فقط کلاس StringResourceModule ...

    در یک پروژه کامل ، هر لایه میتواند شامل کلاسی مشابه Kernel.Application جهت مدیریت لایه و فرمان بارگذاری و نابود سازی اشیای لایه باشد و میتوان تمام هزینه زمانی بازگذاری ماژول های این لایه ها را به پشت پنجره SplashScreen منتقل کرد و حتی گزارش بارگذاری ماژول ها هم روی SplashScreen نشان داد ...

    UILayer
    یک پروژه winform در ساده ترین حالت ممکن است...
    شاید مهم ترین تابع این بخش، (تابع خیلی ناقص و مشکل دار) Transfer باشد که در یک حالت حداقلی وظیفه ترجمه اشیای روی فرم (جالب تر انکه هر کنترلی) را بر عهده دارد.

    در پست قبلی نمونه xml را دیدید و متوجه شدید که نمونه xml پیشنهادی من دو سطحی است که یک gkey گروه دارد و هر گروه میتواند چندین جزء با skey دیگری داشته باشد.

    تابع Transfer هم gkey یک گروه را میگیرد و در ان گروه Text کنترلها را به عنوان skey جزء استفاده میکند...

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

    کد را از داخل vs اجرا و دنبال کنید، متوجه میشوید...
    موفق باشید.

  11. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  12. #19
    کاربر فعال تالار .Net senaps's Avatar
    تاريخ عضويت
    Jul 2008
    محل سكونت
    خونمون
    پست ها
    4,547

    پيش فرض

    سلام..... من یه سوال برام پیش اومد و اون اینکه من همیشه کل دیتام رو میگیرم و میارم به لایه‌ی نمایش و تمام.... حالا الان که دارم با سرویس ها کار میکنم، راستش فکر میکنم که بهینه ترین حالت ممکن اینه که دیتای خام رو از سرور و سرویس بگیرم و تو کلاینتم روش کار کنم........................اگر تو ویندوز 7 چیزی رو سرچ کنین، مثلا یه جست‌جوی اینفینت که همه‌ی فایل ها رو نشون بده، به حالتی نمایش میده که فقط اسمشون رو داری، بعد اگه حالت نمایش رو بذاری روی دیتیل، دوباره میره تو سرچ و طول میکشه!!! این اتفاقیه که الان برا من و برنامه‌های کلاینتم می‌افته.... چون کلاینت فقط نمایش میده و میره دیتاش رو از سرویس میگیره!!!!............اگر مثلا کاربرم بخواد فیلدی رو از گرید حذف بکنه یا نمایش بده، یا نوع سورت دیتا رو عوض بکنه، باید اطلاعات به اون شکل دوباره دریافت بشن!!! راه حل این مسئله چیه؟!

  13. #20
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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


    برای مرتب سازی و برخی موارد ف-ی-ل-ت-ر سریع (غربال در حین تایپ کیبورد) میتوان در مکانیزم های FX4-Typed از Linq و در سایر موارد از کامپونت هایی مانند BindingSorurce استفاده کرد
    ((
    مثلاً در لیست های بازشویی از جداول افراد، کالاها و خدمات و... و...میتوان مکانیزم های کاملی پیاده سازی کرد که در حین تایپ کاربر امکان غربال اطلاعات را بر اساس کد و نام و ... فراهم کند...
    در این موارد که به نوعی جستجوی سریع است نمیتوان با تایپ هر کاراکتر یک دستور SQL جدید را اجرا نمود
    ))


    البته در مورد کش باید به حجم لازم RAM و میزان تغییر اطلاعات هم دقت کنید
    مواردی که خیلی کم تغییر میکنند و خیلی زیاد استفاده میشوند و حجم کمی دارند برای کش بسیار ایده آل هستند.

    بطور مثال در یک برنامه خرید و فروش "گروه های کالا" یا " واحدهای شمارش کالا" یا در مقیاس تجاری بزرگتر "فهرست انبارها" و... گزینه های خوبی برای کش هستند تا کل لیست های بازشو برنامه را تغذیه کنند.

    در مبنای پیشرفته تر میتوانید یک ماژول مرکزی کش داشته باشید که با یک کلید (مثلاً string ای شامل نام دلخواه با ترکیب نام جدول دیتابیس و...) داشته باشید که ضمن کش اطلاعات بتواند زمان انقضایی برای آنها هم در نظر گرفته و بعد گذشت این زمان اطلاعات را حذف کند... چیزی شبیه ماژول مشابه اش در ASP.Net ....
    برای بارگذاری اطلاعات هم میتوان از تکنیک Lazy استفاده کرد و تا زمان اولین درخواست بعدی این کار را به عقب انداخت ...

    =====

    این کارها بدون شک به کدنویسی نیاز دارد و سادگی یک DataAdapter.Fill را ندارد ولی دقت به این جزئیات که شما گفتید و تولید برنامه خوب بدون کدنویسی نمیشود

    مورد اول انکه شما میتوانی مجموعه ای از کلاس ها و کامپونت ها برای خودتان ایجاد کنید که برای هر پروژه و هر کار نیازی به دوباره کاری نداشته باشید.
    یعنی وقتی به یک مکانیزم نیاز دارید با دید وسیع تری آن را طوری طراحی و کدنویسی کنید که برای پروژه های بعدی هم قابل استفاده باشد.
    همین مفهوم لایه بندی / پلاگین پذیری / DLL / OOP و... اگر درست انجام شود به تولید کدهای "قابل استفاده مجدد" (یکی از اصول پایه برنامه نویسی) کمک میکند.

    و مطلب دوم هم آنکه اگر به هر جزء به طور تکی نگاه کنید، متوجه میشود، خیلی هم پیچیده و مشکل نیست، شاید کمی کدبخواهد ولی کد سختی نیست و الگوریتم های پیچیده ریاضی ندارد.

    حالا نمیدانم از مطالب فوق بطور دقیق با پیاده سازی کدام بخشش مشکل دارید؟!

    ====

    گمانم باید بقیه مطالبی که قولش را داده بودم تایپ کنم...
    بابت طولانی شدن انشاا... خواهید بخشید...
    موفق باشید.

  14. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •