PDA

View Full Version : نوشتن کلاس



jaykob
شنبه 01 مرداد 1390, 18:13 عصر
سلام دوستان

من می خوام برای بعضی از اعمال مثل ورود اطلاعات به دیتابیس و ... کلاس بنویسم . این کار رو انجام می دم و مشکلی ندارم اما احساس می کنم که منطق کلاس نویسی از نظر کد نویسی صحیح و امنیت چیز دیگه ای است . و این عدم درک صحیح بعضی موارد توسط من هست . مثلا با مفهوم get و set هنوز آشنایی کاملی ندارم . یا در کلاس ها برخی از فیلد ها به صورت private تعریف می شوند و ... من اینجا یک کلاس ساده برای درج 3 فیلد به بانک اطلاعاتی را در نظر می گیرم که با استفاده از LINQ باشه . می خوام دوستان یک کلاس ساده و منطقی بنویسند و یک توضیح کوتاهی بدهند که چه نکاتی باید رعایت شود و برخی اعمالی که گفته شد چه مزیت هایی دارند .

با سپاس از همه

mohsen.nsb44
شنبه 01 مرداد 1390, 18:29 عصر
سلام دوستان

من می خوام برای بعضی از اعمال مثل ورود اطلاعات به دیتابیس و ... کلاس بنویسم . این کار رو انجام می دم و مشکلی ندارم اما احساس می کنم که منطق کلاس نویسی از نظر کد نویسی صحیح و امنیت چیز دیگه ای است . و این عدم درک صحیح بعضی موارد توسط من هست . مثلا با مفهوم get و set هنوز آشنایی کاملی ندارم . یا در کلاس ها برخی از فیلد ها به صورت private تعریف می شوند و ... من اینجا یک کلاس ساده برای درج 3 فیلد به بانک اطلاعاتی را در نظر می گیرم که با استفاده از LINQ باشه . می خوام دوستان یک کلاس ساده و منطقی بنویسند و یک توضیح کوتاهی بدهند که چه نکاتی باید رعایت شود و برخی اعمالی که گفته شد چه مزیت هایی دارند .

با سپاس از همه
دوست عزیز من بعضی وقتها در برنامه اعمالی که بر روی دیتابیس انجام می دم با کلاس انجام می دم
مثلا یه کلاس واسه ارتباط با بانک و ... استفاده میکنم

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace Matab
{
class DataAccess
{
public string DbName = "D:\\DB\\mtDB.mdf";
SqlConnection con;
SqlCommand cmd;
SqlDataAdapter da;
public DataAccess()
{
con = new SqlConnection();
cmd = new SqlCommand();
da = new SqlDataAdapter();
cmd.Connection = con;
da.SelectCommand = cmd;
}
public void connect()
{
string cs=@"Data Source=.\SQLEXPRESS;AttachDbFilename='"+DbName+"';Integrated Security=True;User Instance=True";
con.ConnectionString = cs;
con.Open();
}
public void disconnect()
{
con.Close();
}
public void docommand(string sql)
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
public DataTable select(string sql)
{
DataTable dt = new DataTable();
cmd.CommandText = sql;
da.Fill(dt);
return dt;
}
}
}

و برای اعمال حذف و ویرایش و ... از یه کلاس دیگه مثل زیر استفاده می کنم

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Matab
{
class C_tell
{
public int id;
public string name;
public string family;
public string tell_home;
public string tell_work;
public string mobile;
public string postalCode;
public string email;
public string adres_home;
public string adres_work;
public string preamble;
DataAccess dm = new DataAccess();
public void Add()
{
string sql = "insert into tellTb(name,family,tell_home,tell_work,mobile,post alCode,email,adres_home,adres_work,preamble)";
sql += "values(N'{0}',N'{1}',N'{2}',N'{3}',N'{4}',N'{5}',N '{6}',N'{7}',N'{8}',N'{9}')";
sql = string.Format(sql, this.name, this.family, this.tell_home, this.tell_work, this.mobile, this.postalCode, this.email, this.adres_home, this.adres_work, this.preamble);
dm.connect();
dm.docommand(sql);
dm.disconnect();
}
public void Delete()
{
dm.connect();
string sql = "delete from tellTb where id={0}";
sql = string.Format(sql, this.id);
dm.docommand(sql);
dm.disconnect();
}
public void Update()
{
string sql = "update tellTb set name=N'{0}',family=N'{1}',tell_home=N'{2}',tell_wo rk=N'{3}',mobile=N'{4}',postalCode=N'{5}',email=N' {6}',adres_home=N'{7}',adres_work=N'{8}',preamble= N'{9}' where id={10}";
sql = string.Format(sql, this.name, this.family, this.tell_home, this.tell_work, this.mobile, this.postalCode, this.email, this.adres_home, this.adres_work, this.preamble,this.id);
dm.connect();
dm.docommand(sql);
dm.disconnect();
}
}
}

و در صفحه مربوطه هم میتونی از کد زیر استفاده بکنی

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 Matab
{
public partial class frmTellBook : Form
{
public frmTellBook()
{
InitializeComponent();
}

ErrorProvider ep = new ErrorProvider();

private void btnDelete_Click(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow == null)
MessageBox.Show("هیچ فیلدی برای حذف انتخاب نشده", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Information);
else if (MessageBox.Show("آیا مطمئن به حذف هستید", "پیام", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
return;
int row = dataGridView1.CurrentRow.Index;
string val = dataGridView1[0, row].Value.ToString();
C_tell ct = new C_tell();
ct.id = Int32.Parse(txtid.Text);
ct.Delete();
showTs_Click(sender, e);
}

private void btnInsert_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrEmpty(txtname.Text) || string.IsNullOrEmpty(txtfamily.Text)
|| string.IsNullOrEmpty(txtTell_home.Text) || string.IsNullOrEmpty(txtAdres_home.Text))
{
ep.SetError(txtname, "خالی بودن این رکورد مجاز نمی باشد");
ep.SetError(txtfamily, "خالی بودن این رکورد مجاز نمی باشد");
ep.SetError(txtTell_home, "خالی بودن این رکورد مجاز نمی باشد");
ep.SetError(txtAdres_home, "خالی بودن این رکورد مجاز نمی باشد");
}
else
{
ep.SetError(txtname, "");
ep.SetError(txtfamily, "");
ep.SetError(txtTell_home, "");
ep.SetError(txtAdres_home, "");
C_tell ct = new C_tell();
ct.name = txtname.Text;
ct.family = txtfamily.Text;
ct.tell_home = txtTell_home.Text;
ct.tell_work = txtTell_work.Text;
ct.mobile = txtmobile.Text;
ct.postalCode = txtPostalCode.Text;
ct.email = txtemail.Text;
ct.adres_home = txtAdres_home.Text;
ct.adres_work = txtAdres_work.Text;
ct.preamble = txtpreamble.Text;

ct.Add();
txtname.Text = "";
txtfamily.Text = "";
txtTell_home.Text = "";
txtTell_work.Text = "";
txtmobile.Text = "";
txtPostalCode.Text = "";
txtemail.Text = "";
txtAdres_home.Text = "";
txtAdres_work.Text = "";
txtpreamble.Text = "";
}
}
catch
{
MessageBox.Show("ارور 015 رخ داده لطفا با برنامه نویس تماس بگیرید", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void showTs_Click(object sender, EventArgs e)
{
DataAccess dm = new DataAccess();
dm.connect();
string sql = "select * from tellTb";
dm.select(sql);
dataGridView1.DataSource = dm.select(sql);
dm.disconnect();

}

private void txtTell_home_KeyPress(object sender, KeyPressEventArgs e)
{
if ((Convert.ToInt32(e.KeyChar) < 48 || Convert.ToInt32(e.KeyChar) > 57) && (Convert.ToInt32(e.KeyChar) != 8))
e.Handled = true;
}

private void addStb_Click(object sender, EventArgs e)
{
btnInsert_Click(sender, e);
}

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.CurrentRow == null)
MessageBox.Show("شما مجاز به انتخاب سطر خالی نمی باشید");
else
{
try
{
int row = dataGridView1.CurrentRow.Index;

string valId = dataGridView1[0, row].Value.ToString();


string valName = dataGridView1[1, row].Value.ToString();
string valFamily = dataGridView1[2, row].Value.ToString();
string valTell_h = dataGridView1[3, row].Value.ToString();
string valTell_w = dataGridView1[4, row].Value.ToString();
string valMobile = dataGridView1[5, row].Value.ToString();
string valPostalCode = dataGridView1[6, row].Value.ToString();
string valEmail = dataGridView1[7, row].Value.ToString();
string valAdres_h = dataGridView1[8, row].Value.ToString();
string valAdres_w = dataGridView1[9, row].Value.ToString();
string valPreamble = dataGridView1[10, row].Value.ToString();
txtid.Text = valId.ToString();
txtname.Text = valName;
txtfamily.Text = valFamily;
txtTell_home.Text = valTell_h;
txtTell_work.Text = valTell_w;
txtmobile.Text = valMobile;
txtPostalCode.Text = valPostalCode;
txtemail.Text = valEmail;
txtAdres_home.Text = valAdres_h;
txtAdres_work.Text = valAdres_w;
txtpreamble.Text = valPreamble;
}
catch
{
MessageBox.Show("خطای 0121 رخ داده با برنامه نویس تماس بگیرید", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

private void button1_Click(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow == null)
{
MessageBox.Show("هیچ رکوردی برای ویرایش انتخاب نشده است");
}
else if (txtid.Text == "")
{
MessageBox.Show("برای ویرایش شما باید سطر مورد نظر را انتخاب کنید");
}
else
{
try
{
C_tell ct = new C_tell();
ct.name = txtname.Text;
ct.family = txtfamily.Text;
ct.tell_home = txtTell_home.Text;
ct.tell_work = txtTell_work.Text;
ct.mobile = txtmobile.Text;
ct.postalCode = txtPostalCode.Text;
ct.email = txtemail.Text;
ct.adres_home = txtAdres_home.Text;
ct.adres_work = txtAdres_work.Text;
ct.preamble = txtpreamble.Text;
ct.id = Int32.Parse(txtid.Text);
ct.Update();
showTs_Click(sender, e);
MessageBox.Show("ویرایش اطلاعات انجام شد", "پیام ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch
{
MessageBox.Show("خطای 0120 رخ داده با برنامه نویس تماس بگیرید", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

private void editStb_Click(object sender, EventArgs e)
{
button1_Click(sender, e);
}

private void deleteStb_Click(object sender, EventArgs e)
{
btnDelete_Click(sender, e);
}

private void newTsb_Click(object sender, EventArgs e)
{
txtname.Text = "";
txtfamily.Text = "";
txtTell_home.Text = "";
txtTell_work.Text = "";
txtmobile.Text = "";
txtPostalCode.Text = "";
txtemail.Text = "";
txtAdres_home.Text = "";
txtAdres_work.Text = "";
txtpreamble.Text = "";
}

private void newTs_Click(object sender, EventArgs e)
{
newTsb_Click(sender, e);
}

private void exitTs_Click(object sender, EventArgs e)
{
this.Close();
}

private void button1_Click_1(object sender, EventArgs e)
{
DataAccess dm = new DataAccess();
string sql = "select * from tellTb where family=N'" + txtSearch.Text + "'";
dm.connect();
dm.select(sql);
dataGridView1.DataSource = dm.select(sql);
dm.disconnect();
}

private void button2_Click(object sender, EventArgs e)
{
this.Opacity = 1;
for (int i = 1; i < 100; i++)
{
Opacity -= 0.01;
Application.DoEvents();
}
if (Opacity < 1)
this.Close();
}



private void frmTellBook_Load(object sender, EventArgs e)
{
//analogClock1.Enabled = true;

}

private void panel1_Paint(object sender, PaintEventArgs e)
{

}

private void txtname_MouseLeave(object sender, EventArgs e)
{




}


}
}

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

jaykob
شنبه 01 مرداد 1390, 18:43 عصر
سلام دوست عزیز ممنون از پاسختون

من در متد های شما دیدم که به صورت public تعریف شدن ولی من در چند مقاله خوندم که فیلد های داخل کلاس باید private تعریف بشن و در نهایت return صورت بگیره ؟
در رابطه با get و set کردن هم اگر امکان هست توضیح کوتاهی بدهید همراه با مثالی ...

ممنون

mohsen.nsb44
شنبه 01 مرداد 1390, 19:07 عصر
دوست عزیز به این دلیل public انتخاب شده که بشه در صفحه از اون استفاده کرد اگه private انتخاب بشه دیگه دسترسی به کدهای داخل کلاسمون نخواهیم داشت
صحبت های من به این معنی نیست که چیزی رو که شما خوندید اشتباه هستش بلکه برعکس اما لازمه که شما مفهوم کپسوله بودن رو بدونید متد های get , set پروپرتی های خواندنی و نوشتنی هستند به این صورت که اگه بخواید خوندنی باشه از get اگه نوشتنی باشه از set و برای هم خواندنی و هم نوشتنی از هر دو انها استفاده می کنیم در کلاسمون یه مثال می زنم امیدوارم اموزنده باشه
فرض کن یه کلاس داری که می خوای یک عدد رو از کاربر دریافت کنه اگه از صفر بزرگتر بود بگه مثبت اگه از صفر کوچکتر بود بگه منفی
ما کلاسمون رو به صورت زیر تعریف می کنیم

private int _num;
public int num{
get{
return_num;}
set{
_num=value;}
حال میتونیم در برنامه خودمون از کد زیر استفاده بکنبم
فرض اسم کلاس ما هست cal


cal cl = new cal();
cl.num = int.Parse(textBox1.Text);
if (int.Parse(textBox1.Text) < 0)
{
MessageBox.Show("manfi");
}
else if (int.Parse(textBox1.Text) > 0)
{
MessageBox.Show("mosbat");
}
توصیه می کنم کتاب هاشمیان بخش شی گرایی اونو بخونی

Saman Hashemi
یک شنبه 02 مرداد 1390, 09:13 صبح
شما ميتوني براي اينكه كلاستون كاملا دايناميك بشه تمام موارد مورد نياز با استفاده از get;setبهش پاس بدين مثل كانكشن،دستورات،sp بودن و نوع ديتابيس و...
اگه برات مهمه متدهاي اصليتو ميتوني Private كني متدهاي ديگه اي داشته باشي كه فقط برات ديتا برگردونه...!