PDA

View Full Version : سازماندهی کدهای زیاد



FreeMagic
جمعه 29 دی 1391, 01:25 صبح
با سلام
من یه فرم دارم که حدود 100 کنترل (حداقل) روش هست. و هرکدوم علاوه بر رویداد کلیک رویدادهای دیگه ای هم دارن و اینا مشابه هم نیستن که یه رویداد رو برای چند تا بنویسم
راهی هست که شبیه کدهای کلاس یا ماژول یا هر چیز دیگه ای هر چند کنترل رو که کارهای مشابه انجام میدن کلا کدهای رویدادهاشون رو توی فایل دیگه بنویسم؟
چشم درد گرفتم ازبس دنبال یه کد این صفحه رو بالا و پایین کردم
ممنون میشم راهنمایی کنید

plus
جمعه 29 دی 1391, 01:35 صبح
اول اینکه بررسی کنید شاید بتونید طراحی بهتری داشته باشید که به این مشکل نخورید.
به هر حال متونید هر تعداد کلاس partial که میخواین توی فایل های مختلف داشته باشید. به صورت پیشفرض وقتی یک فرم میسازین این فرم از 2 تا کلاس partial تشکیل شده یکی مربوط به designer هست در MyForm.designer.cs و اون یکی مربوط به کدهاتون یعنی MyForm.cs.میتونید هرچندتا که میخواین کلاس partial اضافه کنید. مثلا:

// MyForm.events.cs
using System;
using System.Windows.Forms;
using ...
...
...
namespace WindowsFormsApplication1
{
public partial class MyForm
{
// Control Events
}
}


// MyForm.private.cs
using System;
using System.Windows.Forms;
using ...
...
...
namespace WindowsFormsApplication1
{
public partial class MyForm
{
// Private Methods
}
}

FastCode
جمعه 29 دی 1391, 01:45 صبح
اگر نمیتونید از چند تا فرم استفاده کنید:
0.refactor
1.partial class
2.partial method
3.#region
4.Extension method
5.Version Control:
GIT
CVS
mercurial
Microsoft Source Safe
...

FreeMagic
جمعه 29 دی 1391, 01:51 صبح
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MyPro
{
public partial class frm_main : Form
{

}
}

من یه همچین کاری کردم و جواب هم داده ولی فرقش اون قسمت قرمز رنگ هست که شما ننوشته بودید. این تفاوتی نداره یا بعدا که کار پروژه پیش بره ممکنه فرق بکنه؟
ضمنا یه سوال دیگه هم داشتم شاید به همین تاپیک مربوط بشه
من توی C#‎ یه folder جدید به پروژه اضافه میکنم و چند تا فرم هم داخل اون قرار میدم. تا اینجای کار مشکلی نیست. مشکل اینجاست وقتی فرم دیگه ای به پروژه اضافه میکنم دیگه از طریق فرم های دیگه نمیتونم بهش دسترسی پیدا بکنم. اصلا انگار فرمی اضافه نشده. وقتی ctrl+space رو میزنم اسمش توی لیست نیست.
این مشکل رو چه طور میشه برطرف کرد؟
(توی VB.net همچین مشکلی ندارم) VS رو هم باز و بسته کردم و ... ولی درست نشد

FreeMagic
جمعه 29 دی 1391, 01:53 صبح
اگر نمیتونید از چند تا فرم استفاده کنید:
0.refactor
1.partial class
2.partial method
3.#region
4.Extension method
5.Version Control:
GIT
CVS
mercurial
Microsoft Source Safe
...

اینا چی هستن؟:متفکر:
لطفا زیر دیپلم بنویسید متوجه بشم:لبخند:
درضمن از چند تا فرم استفاده میکنم ولی این یکی خیلی شلوغ و پلوغ هست:افسرده: اینم شانس ما بوده با این پروژه گرفتنمون

plus
جمعه 29 دی 1391, 02:03 صبح
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MyPro
{
public partial class frm_main : Form
{

}
}

من یه همچین کاری کردم و جواب هم داده ولی فرقش اون قسمت قرمز رنگ هست که شما ننوشته بودید. این تفاوتی نداره یا بعدا که کار پروژه پیش بره ممکنه فرق بکنه؟
ضمنا یه سوال دیگه هم داشتم شاید به همین تاپیک مربوط بشه
من توی C#‎‎‎ یه folder جدید به پروژه اضافه میکنم و چند تا فرم هم داخل اون قرار میدم. تا اینجای کار مشکلی نیست. مشکل اینجاست وقتی فرم دیگه ای به پروژه اضافه میکنم دیگه از طریق فرم های دیگه نمیتونم بهش دسترسی پیدا بکنم. اصلا انگار فرمی اضافه نشده. وقتی ctrl+space رو میزنم اسمش توی لیست نیست.
این مشکل رو چه طور میشه برطرف کرد؟
(توی VB.net همچین مشکلی ندارم) VS رو هم باز و بسته کردم و ... ولی درست نشد

شما نباید این موضوع که فرم شما از کلاس Form مشخص میشه رو توی همه فایل ها ذکر کنید. کافیه فقط توی یکیشون ذکر بشه.
در مورد سوالتون هم شما namespace فرمی که توی folder ساختین رو از کد چک کنید.وقتی توی یک folder فرمی رو میسازید visual studio خودش اسم اون folder رو به namespace اضافه میکنه.مثلا میشه

using System;
using...
..
namespace WindowsApplication1.Folder1
{
public partial class Form1 : Form
...
...
}

در این حالت فرم هایی که در اون folder نیستن در اون namespace هم نیست و مستقیم به اون فرم دسترسی ندارن.میتونید یا namespace ها رو اصلاح کنید یا از چیزی مثل این استفاده کنید:

using System;
using...
..
namespace WindowsApplication1
{
public partial class Form2 : Form
...
...
void SomeMethod()
{
Folder1.Form1 form1 = new Folder1.Form1();
...
}
}

FreeMagic
جمعه 29 دی 1391, 02:18 صبح
من هر دو مورد رو تست کردم
برای اون ساماندهی وقتی کلاس رو وارد میکنم بعد از چند لحظه VS اون رو به عنوان یه فرم جدید میشناسه:متعجب: طوری که میشه واسش رویداد و ... تعریف کرد ولی بعدش دیگه پروژه اجرا نمیشه و پیغام خطا میده
در ضمن اون کاری که گفتید برای پوشه بندی بکنم جواب نداد. یعنی موقع کد نویسی Folder ها رو نمیشناسه که از طریق اونا بشه به فرم مورد نظر دسترسی پیدا کرد

FastCode
جمعه 29 دی 1391, 02:21 صبح
اینا چی هستن؟:متفکر:
لطفا زیر دیپلم بنویسید متوجه بشم:لبخند:
درضمن از چند تا فرم استفاده میکنم ولی این یکی خیلی شلوغ و پلوغ هست:افسرده: اینم شانس ما بوده با این پروژه گرفتنمون
اگر نمیتونید از چند تا فرم استفاده کنید:
0.refactor
یعنی هر کدی که چند باز استفاده میشه رو جدا کنید و در یک تابع بنویسید
توابع بزرگ رو چند قسمت کنید
1.partial class
این یکی توضیح داده شد
2.partial method
توابعی را که ممکنه کامپایل نشن رو به شکل partial در یک فایل دیگه بنویسید
3.#region
کدتون رو با دستورهای pre-processor ه #region و #endregion تقسیم کنید
4.Extension method
عملیاتی که به متغیرهای داخل فرم بسنگی ندارد رو در یک کلاس دیگه بنویسید
برای این مورد توی اینترنت جست و جو کنید.سادست
5.Version Control:
اگر کدتون خیلی تغییر میکنه میتونید با یه VCS نسخه های مختلف کدتون رو کنترل و مقایسه کنید
GIT
bazaar
monotone
CVS
mercurial
Microsoft Source Safe

plus
جمعه 29 دی 1391, 02:22 صبح
در هر دو مورد، محتویات اصلی (بدون محتوات داخل کلاس فرم) چندتا کلاسی که دارین و VS خطا میده رو بگذارین (در تگ CSHARP).

FreeMagic
جمعه 29 دی 1391, 02:32 صبح
این کلاس جدیدی هست که به طور آزمایشی اضافه کردم و دستورات فرم لود صفحه اصلی رو کاملا اینجا انتقال دادم.
تا اینجا مشکلی نداره و راحت اجرا میشه ولی مشکل از وقتی شروع میشه که روی آیکونش در solution explore دابل کلیک میکنم. بعد از اون دیگه به کلاس رو به عنوان فرم میشناسه. (مگه اینکه بدون دابل کلیک به کدها دسترسی پیدا بکنم که مشکل پیش نیاد)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Razmandegan
{
public partial class frm_main
{
private void frm_main_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
balance_obj();



}
}
}

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

plus
جمعه 29 دی 1391, 02:56 صبح
جالبه.برای حل این مشکل میتونید از DesignerCategory Attribute استفاده کنید:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Razmandegan
{
[System.ComponentModel.DesignerCategory("code")]
public partial class frm_main
{
private void frm_main_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
balance_obj();



}
}
}

اینطوری VS فایل شما رو به عنوان کد میشناسه و Designer برای نمیاره.البته برای این کار فایتون رو باید delete کنید و از اول ایجاد کنید.

برای مشکل فلدر بندی هم مثل همینجا، کد فایل ها رو، صرف نظر از کد داخل class بگذارید.

FreeMagic
جمعه 29 دی 1391, 03:18 صبح
[System.ComponentModel.DesignerCategory("code")]
این یه خط چی کار میکنه؟:متفکر: تغییری ندیدم
ضمنا از قسمت add و new item گزینه ای هست به اسم codefile
میشه برای طبقه بندی کدها از این استفاده کرد:لبخند: ظاهرا روش دابل کلیک بشه مشکل کلاس رو بوجود نمیاره
ضمنا برای پوشه بندی من نمیدونم چه کدی رو باید قرار بدم یعنی کدنویسی نکردم که بخوام اینجا قرار بدم
فرض کنید من فرم frm_test رو بعد از پوشه بندی اضافه کردم. در محیط frm_main من این دستور رو نوشتم
frm_test = new frm_test();
سر این خط پیغام میگیره و اصلا frm_test رو نمیشناسه:متفکر:

__________________________________________________ _____
ویرایش:
ببخشید کاربرد اون یک خط اول رو الان متوجه شدم

plus
جمعه 29 دی 1391, 03:32 صبح
این روش به VS میگه این فایل کد هست و با double click روی اون، designer رو نمیاره.من با گذاشتن این مشکل رو حل کردم.نمیدونم چرا برای شما حل نشد.همونطور که گفتم حتما باید فایلی که قبلا ساختین و VS به عنوان فرم شناخته رو حذف کنید و از اول بسازید.
شما همون کدهایی که توی frm_main.cs و frm_test.cs هست رو بگذار.

FreeMagic
جمعه 29 دی 1391, 03:51 صبح
این روش به VS میگه این فایل کد هست و با double click روی اون، designer رو نمیاره.من با گذاشتن این مشکل رو حل کردم.نمیدونم چرا برای شما حل نشد.همونطور که گفتم حتما باید فایلی که قبلا ساختین و VS به عنوان فرم شناخته رو حذف کنید و از اول بسازید.
شما همون کدهایی که توی frm_main.cs و frm_test.cs هست رو بگذار.

برای مشکل کدها پست رو ویرایش کردم و نوشتم که مشکل برطرف شده
من یه پوشه درست کردم به اسم Forms که فرم ها رو در اون قرار بدم (البته میخواستم در صورت اضافه شدن فرم های بیشتر، برای همین فولدر هم ساب فولدر قرار بدم که فعلا اصلا نمیشه پوشه ساخت)
توی frm_test که چیزی نیست (یعنی قراره فرا خونده بشه و فکر نکنم محتویاتش مهم باشه)
کد فایل frm_main برای فراخوانی frm_test این هست
frm_test frm = new frm_test();
frm.Show();
البته گاهی از همچین فرمی استفاده میکنم
frm_test frm = new frm_test();
frm.Parent = this;
frm.Show();
که VS به خط اول این کدها گیر میده و ضمنا هر دو در یک فولدر هستن

plus
جمعه 29 دی 1391, 04:37 صبح
دوست عزیز منظورم کد کل فایل هست از اول تا آخر، نه کد داخل کلاس.

FreeMagic
شنبه 30 دی 1391, 01:04 صبح
دوست عزیز منظورم کد کل فایل هست از اول تا آخر، نه کد داخل کلاس.

اخه فایل خالی هست و فقط همون چند خط پیش فرض هستش:لبخند:
[System.ComponentModel.DesignerCategory("code")]
در ضمن وقتی من این یه خط کد رو به برنامه اضافه میکنم فایل اصلی خود فرم رو هم به صورت کلاس نشون میده و نمیتونم نمای دیزاین رو ببینم. وقتی هم برمیدارم این دفه کلاس ها مثل فرم میشن.
این چه طوری درست میشه؟

plus
شنبه 30 دی 1391, 01:40 صبح
منظوره من از using اون بالا هست تا } پایین.به هر حال بیخیال، شما namespace ی که در فایل ذکر شده رو باید چک کنید.
در مورد مشکل دوم هم چیزی به ذهنم نمیرسه.

FastCode
شنبه 30 دی 1391, 04:02 صبح
این فایلی که میگی حالا چند خط هست؟
اگر کمتر از ۱۰ هزار ه به نظر من هنوز زیاد نشده.تا این حد رو میشه با نامگزاری و قالب بندی درست در یک فایل مدیریت کرد