PDA

View Full Version : سوال: چند سوال درباره کلاس



seven7777777
چهارشنبه 09 اردیبهشت 1388, 15:27 عصر
دوستان من با کمک شما شروع به نوشتن کلاس کردم . الان یه کلاس واسه کاربران نوشتم که کدش در زیر :


class Users
{
private string _code;
private string _fname;
private string _lname;
private bool _sex;
private string _intcode;
private string _username;
private string _password;

public Users()
{
_code = _fname = _lname = _intcode = _username = _password = String.Empty;
_sex = false;
}

public Users(string code)
{
try
{
if (IsExist("Members", "code=" + code))
{
SqlCommand com = new SqlCommand();
com.Connection = New_Connection();
com.CommandText = "SELECT fname,lname,sex,intcode FROM Members WHERE code=@c";
com.Parameters.AddWithValue("@c", code);
SqlDataReader reader = com.ExecuteReader();
reader.Read();
_code = code;
_fname = reader.GetString(0);
_lname = reader.GetString(1);
_sex = reader.GetBoolean(2);
_intcode = reader.GetString(3);
}
}
catch (Exception ex)
{
}
}

public string code
{
get { return _code; }
set { _code = value; }
}
public string fname
{
get { return _fname; }
set { _fname = value; }
}
public string lname
{
get { return _lname; }
set { _lname = value; }
}
public bool sex
{
get { return _sex; }
set { _sex = value; }
}
public string intcode
{
get { return _intcode; }
set { _intcode = value; }
}
public string username
{
get { return _username; }
set { _username = value; }
}
public string password
{
get { return _password; }
set { _password = value; }
}

privatestatic SqlConnection New_Connection()
{
SqlConnection _sqlcon = newSqlConnection();
_sqlcon.ConnectionString = "Data Source=(local);Initial Catalog=Sharif_Res_DB;Integrated Security=True";
_sqlcon.Open();
return _sqlcon;
}

publicbool IsExist(string table, string whcol)
{
SqlCommand com = new SqlCommand();
com.Connection = New_Connection();
com.CommandText = "SELECT COUNT(id) FROM " + table + " WHERE " + whcol;
int num = Convert.ToInt32(com.ExecuteScalar());
com.Connection.Close();
if (num > 0)
return true;
return false;
}

public string New_Percode()
{
string _percode = String.Empty;
SqlCommand com = newSqlCommand();
com.Connection = New_Connection();
com.CommandText = "SELECT MAX(id) FROM Users";
SqlDataReader reader = com.ExecuteReader();
if (reader.Read())
_percode = (reader.GetInt32(0) + 1).ToString();
else
_percode = "10000";
_percode = PersianDate.Now.Year.ToString().Substring(2, 2) + _percode + "000";
reader.Close();
com.Connection.Close();
return _percode;
}

public bool Reg_NewUser()
{
try
{
string subcol = String.Empty;
string subval = String.Empty;
if (!String.IsNullOrEmpty(_intcode))
{
subcol = ",intcode";
subval = ",@i";
}
SqlCommand com = new SqlCommand();
com.Connection = New_Connection();
com.CommandText = "INSERT INTO Users (code,fname,lname,sex" + subcol + ") VALUES (";
com.CommandText += "@c,@f,@l,@s" + subval + ")";
com.Parameters.AddWithValue("@c", _code);
com.Parameters.AddWithValue("@f", _fname);
com.Parameters.AddWithValue("@l", _lname);
com.Parameters.AddWithValue("@s", _sex);
try
{
com.Parameters.AddWithValue("@i", _intcode);
}
catch (Exception ex)
{
}
com.ExecuteNonQuery();
return true;
}
catch
{
return false;
}
}

public static bool Del_User(string code)
{
try
{
SqlCommand com = newSqlCommand();
com.Connection = New_Connection();
com.CommandText = "DELETE FROM Users WHERE code=@c";
com.Parameters.AddWithValue("@c", code);
com.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
return false;
}
}

public bool Update_User()
{
return true;
}
}

حالا چند سوال :
1. درست نوشتم یعنی قوانین توش رعایت شده ؟
2. به عنوان مثال من فیلد کد ملی کاربر رو در دیتابیس NULL گذاشتم . حالا این که چک کنم که اگه این متغیر در برنامه مقدار نداره یا اگه داره باید در کلاس اعمال بشه یا کلاس باید به شکل کلی نوشته بشه و من این حالت رو در برنامم چک کنم ؟ ( مثلا من اومدم و تو کلاس اینو چک کردم ، در تابع Reg_NewUser())
3. کلا راهی هست که چک کنیم اگه برخی متغیرهای اجباری در فرم مثل نام خالی هستند ، ما بفهمیم یا باید حتما تک تک اونها چک بشن ؟
4. من می خوام کلاس Members رو هم بنویسم که از این کلاس به ارث ببره ، اینم یه توضیح بدین لطفا .


پیشاپیش هم تشکر می کنم

NewFoxStudent
چهارشنبه 09 اردیبهشت 1388, 16:39 عصر
برای چک کردن فیلدهای یه کلاس من معمولا از یه متد توی همون کلاس استفاده میکنم که فیلدها رو چک میکنه و برای هر نمونه از کلاس در موقع ذخیره اول اون متد رو صدا میزنم

esmaeily-hosein
چهارشنبه 09 اردیبهشت 1388, 17:36 عصر
اسم کلاستو از users به User تغییر بده چون عملا داری با یه کاربر کار میکنی .

try
{
if (IsExist("Members", "code=" + code))
{

چیز غریبیه معولا اگر نبود یه throw Exception میکنند .

در کل برای شروع بد نیست سعی کن Source code زیاد بخونی اینجوری دیدت بهتر میشه

seven7777777
پنج شنبه 10 اردیبهشت 1388, 00:03 صبح
راستی دوست عزیز لطف کن تفاوت throw Exeption رو با catch به من بگو . می خواستم سوال کنم یادم رفته بود .
اگه میشه بگو چه نقاتی از کد ضعف فجیعی داره که میگی Source Code زیاد ببینم تا رو اونا بیشتر Focus کنم .

vahid.bz
پنج شنبه 10 اردیبهشت 1388, 00:33 صبح
سلام
وقتی می خوای توی برنامه نویسی بگی "خطایی از نوع ایکس بده" از throw استفاده می کنی و وقتی می خوای بگی "خطایی از نوع ایکس بگیر "از catch استفاده می کنی و وقتی می خوای بگی "ای بر نامه توی این قسمت احتمال پرتاب خطا هست"ازtry استفاده می کنی

vahid.bz
پنج شنبه 10 اردیبهشت 1388, 00:50 صبح
class Member:User
{}
1.در کلاس ای که به ارث می بری لازم نیست متغیر های شی ای قبلی رو دو باره بنویسی و فقط کافی متغیرهای جدیدت بنویسی

adinochestva
پنج شنبه 10 اردیبهشت 1388, 01:19 صبح
اینجا


public static bool Del_User(string code)
{
try
{
SqlCommand com = newSqlCommand();
com.Connection = New_Connection();
com.CommandText = "DELETE FROM Users WHERE code=@c";
com.Parameters.AddWithValue("@c", code);
com.ExecuteNonQuery();



اگر مقدار رو چک کنی بهتره البته ممکنه تو لایه های بالاتر این کار رو انجام بدی
در غیر این صورت با پاس کردن مقدار
"1" or 1=1
می شه کل کاربران رو پاک کرد

درضمن اگه قراره برای هر کاربر یک instane از این کلاس ایجاد کنی دیگه del_user با پارامتر معنا نداره
وقتی فراخوانی میشه همون کاربر که این متد تو اون فراخوانی می شه رو باید پاک کنی.
همچنین add user

esmaeily-hosein
پنج شنبه 10 اردیبهشت 1388, 08:15 صبح
. کلا راهی هست که چک کنیم اگه برخی متغیرهای اجباری در فرم مثل نام خالی هستند ، ما بفهمیم یا باید حتما تک تک اونها چک بشن ؟
با این روشی که تو استفاده کردی نه .


گر مقدار رو چک کنی بهتره البته ممکنه تو لایه های بالاتر این کار رو انجام بدی
من با این حرف دوستمون کاملا مخالفم .


class Member:User
این Class فعلا به درد ارث بری نمیخوری لا اقل متد هات به صورت virtual بنویس . تا یه خورده بهتر شه .


گه میشه بگو چه نقاتی از کد ضعف فجیعی داره که میگی Source Code زیاد ببینم تا رو اونا بیشتر Focus کنم .
همونطور تو پست های قبلی هم گفتم اساس محور .net اونهایی که واقعا بصورت .net فکر میکنند thinking small code است . یعنی هیچوقت چرخو دوباره اختراع نمیکنند . ولی بازم میگم برای شروع خوبه
کلا خوندن source code همیشه خوبه حتی بزرگترین برنامه نویس ها هم اینکارو میکنند چون هر source code مثل امضا میمونه و مال هر کسی با کس دیگه فرق میکنه اینکه آدم متوجه بشه جور دیگه ای هم میشه فکر کرد خیلی خوبه شاید من این کلاسو مینوشتم 50خط میشد شاید کس دیگه با 10 خط بنویسه .
کلا بر میگرده به نگاه طرف به oo .

seven7777777
پنج شنبه 10 اردیبهشت 1388, 08:51 صبح
چیز غریبیه معولا اگر نبود یه throw Exception میکنند .

نحوه هندل کردن خطاها رو تغییر دادم .


در غیر این صورت با پاس کردن مقدار "1" or 1=1 می شه کل کاربران رو پاک کرد
خوب یعنی query من به شکل زیر در می آد :

DELETE FROM Users WHERE code="1=1"
یا یه چیزی تو این مایه ها .
فکر نمی کنم این مشکلی ایجاد کنه !!!
اگه کلا بعد از where رو از ورودی می گرفتم فکر کنم مشکل ساز می شد . حالا نمی دونم اگه مشکل داره تغییرش بدم ؟؟؟


درضمن اگه قراره برای هر کاربر یک instane از این کلاس ایجاد کنی دیگه del_user با پارامتر معنا نداره
وقتی فراخوانی میشه همون کاربر که این متد تو اون فراخوانی می شه رو باید پاک کنی.
همچنین add user
خوب فرض کن مدیر وارد سیستم بشه و بره تو بخش اعضا که یک دیتاگرید شامل کد ، نام و نام خانوادگی اونهاست . حالا یک ردیف رو انتخاب کنه و کلید حذف رو بزنه . در این حالت فکر نمی کنم نیاز باشه که یک شی ساخته بشه . ولی در مورد ثبت کاربر چون اعضا داده ای کلاسم باید مقدار بگیرند تا کاربر جدیدو ثبت کنم ، مجبورم یک شی ازش بسازم .


با این روشی که تو استفاده کردی نه .

یعنی چی ؟ معمولا چه روشی استفاده می کنن ؟ بیشتر اینو توضیح بده البته لطفا .


من با این حرف دوستمون کاملا مخالفم .

با کدوم قسمتش ( چک کردن یا محل چک کردن ) و چرا ؟


این Class فعلا به درد ارث بری نمیخوری لا اقل متد هات به صورت virtual بنویس . تا یه خورده بهتر شه .
آخه من در کلاس دوم فقط از اعضا داده ای و یکی یا نهایتا دو تا از توابع این کلاس استفاده می کنم و بقیه رو باید override کنم .


کلا خوندن source code همیشه خوبه
حتما این کارو می کنم .

در کل اگه موارد دیگه ای در این کلاس می بینید خوشحال میشم راهنماییم کنید .

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

seven7777777
شنبه 12 اردیبهشت 1388, 10:04 صبح
چی شد ، از دوستان هیچ کس نمی خواست از جوابش دفاع کنه یا توضیحی بده ؟!؟!؟!؟!

NewFoxStudent
شنبه 12 اردیبهشت 1388, 10:37 صبح
به طور کلی طراحی و اجرای کلاس به دید خود شخص بستگی داره و همینطور به نوع پروژه و نحوه اجرای اون

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

esmaeily-hosein
دوشنبه 21 اردیبهشت 1388, 23:55 عصر
به طور کلی طراحی و اجرای کلاس به دید خود شخص بستگی داره

تو پروژه های خونگی این حرف کاملا متینه ولی در مورد پروژه های تجاری داستان به کلی فرق میکنه احتمالا به زودی نمونه کدی در تاپیک layering میزارم .

ببین در دنیای .net چند جور آدم هست .
1- برنامه نویس حقوق از 700 تومان تا 10000 تومان در ساعت
2- معمار از 7000 تا 25000 تومان (معمولا مدیر پروژه هم هست )
3 - مشاور از 20000 تا 30000 تومان
و ...
البته این قیمت های ایرانه . و افراد مختلفی که من میشناسم شاید پایینتر یا بالاتر از اینها هم باشه من نشناسم ولی فعلا عرفه .

طراحی کلاس های پروژه های به درد بخور در 100 موارد برای نفر دوم و سوم است و کد نویس با عرض معذرت نقش مرده شور بازی میکنه .