PDA

View Full Version : در مورد این کلاس(ارتباز با Database) نظر بدین!



Bahar_HS
چهارشنبه 23 تیر 1389, 10:57 صبح
با سلام
برای ارتباط با دیتابیس این کدلاس رو نوشتم:



using System;
//using System.Windows.Forms;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace factor
{
class RelationToDataBase
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sda = new SqlDataAdapter();
DataSet ds = new DataSet();
//
public RelationToDataBase(string DataBaseName)
{
con.ConnectionString = "Data Source = (local);Initial Catalog =" + DataBaseName + ";Integrated Security=True";
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
}

private void Select(string SP, string TableName)
{
cmd.CommandText = SP;
sda.SelectCommand = cmd;
con.Open();
sda.Fill(ds, TableName);
con.Close();
}
public void UDI(string SP, ArrayList array)
{
//UDI : UpDate , Insert , Delete
cmd.CommandText = SP;
cmd.Parameters.Clear();
for (int i = 0; i <= array.Count - 1; i++)
cmd.Parameters.AddWithValue("@fild"+i,array[i]);
//
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}



وبعد هم به این صورت در کلاس فرم ازش استفاده کردم:



private NumberTextBox numberTextBox2;
private System.Windows.Forms.Button btnInsert;
private factor.RelationToDataBase obj = new RelationToDataBase("factor");


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

باسپاس از راهنمایی و توجه تون

salehbagheri
چهارشنبه 23 تیر 1389, 13:18 عصر
1. مشکل در نام گذاری کلاسها و متغیرها ... (بدبو)
2. جامع نبودن کد:
- کدهاتون رو باید به صورت Function بنویسید تا یه چیزی بازگشت بده و بتونید بهتر اوضاع رو تحت کنترل در بیارید.
- در ضمن بخش UID هم بسیار بد طراحی شده! این موارد رو باید از هم جدا کنید.
- نکته بعدی هم اینه که مبحث شی گرایی رو رعایت نکردید.
- اگه من از کلاس شما در یک فرم دوبار استفاده کنم به احتمال زیاد به خطا میخورم.
3. عدم کنترل خطاها :
- اگر خطایی رخ بده برنامه ممکنه دچار مشکل بشه. نه از TryCatch استفاده کردید و نه ...

من از 10 به شما 2 میدم.

karim_medusa
چهارشنبه 23 تیر 1389, 13:46 عصر
- ConnectionString رو استاتیک در نظر گرفتی (به غیر از نام جدول) بهتره که پویا بشه . به نظر خودم بهتره به صورت یک پارامتر توسط سازنده کل ConnectionString رو دریافت کنی. در لایه بالاتر ConnectionString رو از یک فایل Config بخونی.

- استفاده از Hashtable یا یک لیست جنریک دیگه که به صورت کلید و مقدار است برای پارامتر های SP توصیه میشه بجای arrayList .

- دستور Select پارامتر نمی گیره در صورتی که خیلی لازم میشه.

- حداقل برای دسترسی به DataSet باید یک فکری بکنی یا public بشه به صورت پروپرتی یا یک متد تعریف کنی که DataSet رو برگردونه.

hamzehsh
چهارشنبه 23 تیر 1389, 15:32 عصر
منم موافقم نام گذاري و چندتاچيز مشكل داره.
خيلي پيچيده و تو در تو شده.
من خودم از ConnectionString استفاده ميكنم. و به صورت استاتيك تعريف ميكنم و از فرم لاگين بهش مقدار ميدم كه هميشه در دسترس باشه. كلا من امنيت خود SQL رو بيشتر ترجيج ميدم و User را روي Logins تعريف ميكنم.

اَرژنگ
چهارشنبه 23 تیر 1389, 16:51 عصر
این نوع کدها حتی برایه شروع هم بکار نمیاند.
به جایه اینکه وقتتان را بر رویه این قسمتها تلف کنید حداقل از DateSet Designer و Typed DataSet شروع کنید. اگر هم واقعاً روش پیشرفته را میخواهید به Entity Framework نگاه بندازید.

Bahar_HS
پنج شنبه 24 تیر 1389, 10:53 صبح
1. مشکل در نام گذاری کلاسها و متغیرها ... (بدبو)
متغیرها چطور نامگذاری بشن درسته و کدبدبو نمیشه؟

1
2. جامع نبودن کد:
- کدهاتون رو باید به صورت Function بنویسید تا یه چیزی بازگشت بده و بتونید بهتر اوضاع رو تحت کنترل در بیارید.
چرا باید حتما چیزی برگشت داده بشه؟این کنترل اوضاع که می گید برای چیه؟یا در چه مواقعی لازمه؟


- در ضمن بخش UID هم بسیار بد طراحی شده! این موارد رو باید از هم جدا کنید.
من می خواستم خلاصه ترین حالت رو برای کلاس در نظر بگیرم،ومعمولا از طریق فراخوانی SPها با دیتابیس کار میکنم،اگر بخوام از هم جداشون کنم میشه سه تا ساب روتین کاملا یه جور با نامهای متفاوت،اون وقت این تکرار در برنامه نمیشه؟


- نکته بعدی هم اینه که مبحث شی گرایی رو رعایت نکردید.
اینو که اصلا متوجه نشدم!


- اگه من از کلاس شما در یک فرم دوبار استفاده کنم به احتمال زیاد به خطا میخورم.
3. عدم کنترل خطاها :
- اگر خطایی رخ بده برنامه ممکنه دچار مشکل بشه. نه از TryCatch استفاده کردید و نه ...

من از 10 به شما 2 میدم.

نمی دونم درست می گم یا نه ، ولی می خوام از این کلاس به عنوان یه عضو داده ی کلاس فرم استفاده کنم،مثل بقیه کنترل هایی که روی فرم قرار میدیم ،


ممنونم از توجه و راهنمایی تون،:تشویق::تشویق::تشویق:
این که از 10 ،2 گرفتم به خاطر اینه که روی نقطه ی شروعم
و به این دلیل کلاس رو روی فروم گذاشتم وازتون خواستم نظر بدین تا بتونم جلو برم و با راهنمایی بفهمم که چطور باید ادامه بدم ،
برای ادامه مسیر راهنمایی م کنید .
با سپاس

Bahar_HS
پنج شنبه 24 تیر 1389, 11:00 صبح
-
- دستور Select پارامتر نمی گیره در صورتی که خیلی لازم میشه. .
دستور Select که پارامتر می گیره ،نام SP و نام جدول که در دستور

sda.fill(ds."tabename")

-
- حداقل برای دسترسی به DataSet باید یک فکری بکنی یا public بشه به صورت پروپرتی یا یک متد تعریف کنی که DataSet رو برگردونه.
بله ، با نظر شما موافقم،باید به DataSet دسترسی داشت.

Bahar_HS
پنج شنبه 24 تیر 1389, 11:04 صبح
به تابع سازنده هم ایراد وارده؟می خواستم تکرار رو حذف کنم و مقدار دهی رشته ی اتصال و Command رو د راین قسمت گذاشتم.





public RelationToDataBase(string DataBaseName)
{
con.ConnectionString = "Data Source = (local);Initial Catalog =" + DataBaseName + ";Integrated Security=True";
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
}

Bahar_HS
پنج شنبه 24 تیر 1389, 11:09 صبح
تابع سازنده چه اشکالی داره؟می خواستم مقداردهی رشته کانکشن و command فقط یکبار
باشه،و هنگامی که شی ای از کلاس ایجادمیشه این مقداردهی انجام بشه.




public RelationToDataBase(string DataBaseName)
{
con.ConnectionString = "Data Source = (local);Initial Catalog =" + DataBaseName + ";Integrated Security=True";
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
}




:تشویق::تشویق::تشویق:با سپاس از راهنمایی همه دوستان:تشویق::تشویق::تشویق:

salehbagheri
پنج شنبه 24 تیر 1389, 11:36 صبح
متغیرها چطور نامگذاری بشن درسته و کدبدبو نمیشه؟
توصیه میکنم این تاپیک رو کامل بخونید:
http://barnamenevis.org/forum/showthread.php?t=224704


چرا باید حتما چیزی برگشت داده بشه؟این کنترل اوضاع که می گید برای چیه؟یا در چه مواقعی لازمه؟
حتما که نه ولی بهتره!
بعضی اوقات هست که بدون Throw خطا عملیات ارتباط با پایگاه داده انجام نمیشه. (برای خودم پیش اومده)
وقتی از Function ها استفاده میکنید میتونید مقداری رو دریافت کنید و بر اساس اون درستی انجام عملیات رو تشخیص بدید.


من می خواستم خلاصه ترین حالت رو برای کلاس در نظر بگیرم،ومعمولا از طریق فراخوانی SPها با دیتابیس کار میکنم،اگر بخوام از هم جداشون کنم میشه سه تا ساب روتین کاملا یه جور با نامهای متفاوت،اون وقت این تکرار در برنامه نمیشه؟
مهم نیست ولی همیشه سعی کنید هر کاری رو به یک تابع اختصاص بدید. البته میتونید سه تابع جدا گانه Delete,Insert,Update ایجاد کنید و در اون تابع UID رو فراخوانی کنید.


اینو که اصلا متوجه نشدم!
مبحث شئ گرایی خیلی گسترده و پیچیده هست ولی به صورت ساده میتونید به جای پارامترهای array یک شئ تعریف کنید و اون شئ رو به تابع پاس بدید.

------------
در کل کدهاتون خیلی نیاز به Refactor داره و خیلی بهتر از این میشه نوشتش.

اَرژنگ
پنج شنبه 24 تیر 1389, 16:01 عصر
توصیه من این است که این کلاس را ادامه ندید، کدهایه اینگونه که برایه کارکردن به داتابیس هستند دموده و قدیمی شدند، حتی اگر این کلاس با رعایت تمام اصول نامذاری و پایبندی به تمام اصول شیگرائی نوشته بشه بازهم به حداقل چیزی که ۴ سال پیش در ویژوال داتاست دیزاینر موجود بود نمیرسه.
برایه پیشرفت به نوشتن کنترلها و یا کمپوننتها توجه کنید.
اصل این مبحث که به این کلاس توجه بشد اشتباه است، هر چقدر یک کشتی چوبی را هم درست بسازند بازهم نسبت به قایق آهنی درجه دوم حساب میشه.

Hsn.Zare
جمعه 25 تیر 1389, 15:07 عصر
سلام. اگه مي خواين يه روش خوب براي خودتون واسه توسعه برنامه هاتون داشته باشين توصيه مي كنم حتما برين به سراغ طراحي شي گرا و برنامه نويسي لايه اي . اين كلاسي كه شما نوشتين خيلي خوبه براي شروع اما هر كاري كني باز يه جاش مي لنگه .

Bahar_HS
جمعه 25 تیر 1389, 18:45 عصر
با سلام
و با سپاس از راهنمایی هاتون:تشویق::تشویق::تشویق:


پس رفتم سراغ طراحي شي گرا و برنامه نويسي لايه اي !


باآرزوی پیشرفت برای همه ی اهالی"برنامه نویس"،
هم حرفه ای ها وهم تازه کارها.