PDA

View Full Version : نحوی صحیح برنامه نویسی شی گرایی oop و ارث بری Polymorphism



Mostafa_G2
شنبه 30 دی 1391, 12:32 عصر
سلام دوستان آقا من دارم پروژه دانشگاهیم رو شروع میکنم تا چند وقت دیگه تحویل بدم
همین اولش به مشکل برخوردم
راستش نمیدونم به صورت درست ( شی گرایی و ارث بری) کد مینویسم یا اینکه کد مشکل داره ( البته شاید کد نوشتنم یه مقدار خنده دار باشه چون حس میکنم یه چیزی که مصرفی نداره رو الکی نوشتم یا میتونستم یجوره دیگه بنویسم یا اصلا شاید معنی ارث بری رو درست متوجه نشد باشم, من الان گیج شدم و نمی دونم باید چه کنم)
به نظرتون من به جای کلاس database از interface استفاده کنم بهتره؟ اصلا چه جور توابعی ما باید تو interface یا تو این جور کلاس ها بنویسیم؟ توابعی که معمولا چندین کاربرد دارند و به چندین روش مختلف میشه نوشت و هر روش یه کاری انجام میده؟ مثل تابع makeSound که بسته به نوع آبجکتی که بهش ارسال میشه یه صدای متفاوت برمیگردونه.....یا اینکه هر جور توابعی میتوونیم بنویسیم؟

من فکر میکنم کدی که نوشتم به احتمال مشکل داره (ارور نمیده و ریزالت هم برمیگردونه, من فقط فکر میکنم که از لحاظ شیوه برنامه نویسی مورد داره) میخواستم من رو راهنمایی کنید و اصلاح شدش رو واسم بنویسید, ممنون میشم





database.class.php



<?php


class Database {

//protected functions

protected static function openConnection($returned) {}




//private functions

private function confirmQuery($result) {}




//public functions

public function getConnection() {}

public function closeConnection($conn, $stmt) {}

public function prepareQuery($db, $sql) {}

public function query($sql) {}

public function findAll() {}

public function findById() {}


}








conf.php


<?php

defined('DB_HOST') ? NULL : define("DB_HOST", 'localhost');
defined('DB_USER') ? NULL : define("DB_USER", 'test_user');
defined('DB_PASS') ? NULL : define("DB_PASS", 'Bqedp5CKbHN3zzEK');
defined('DB_NAME') ? NULL : define("DB_NAME", 'test_db');











MySQLDatabase.class.php



<?php

require('Database.class.php');
require('conf.php');


class MySQLDatabase extends Database {


function __construct() {
$this->openConnection(false);
}

protected static function openConnection($returned) {
if($returned) {
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if(mysqli_connect_errno())
die('Connection failed becuse ' . $this->mysqli->error);

return $mysqli;
} else {
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if(mysqli_connect_errno())
die('Connection failed becuse ' . $this->mysqli->error);
}
}

public function closeConnection($conn, $stmt) {
if(isset($stmt)) {
$stmt->free_result();
unset($stmt);
}

if(isset($conn)) {
$conn->close();
unset($conn);
}
}

public function getConnection() {
return self::openConnection(true);
}

public function prepareQuery($db, $sql) {
if(!$stmt = $db->prepare($sql))
die('Query faield beacuse blow issue:<br /><ul><li>' . $db->error . '</li></ul>');

return $stmt;
}

}










functions.php



<?php

require_once('includes/MySQLDatabase.class.php');
require_once('Database.class.php');



function openConnection($obj) {
if($obj instanceof Database) {
return $obj->getConnection();
} else {
echo 'Error: Passed wrong kind of object';
}
echo "<br />";
}











index.php



<?php

require_once('includes/MySQLDatabase.class.php');
require_once('includes/functions.php');


$db = new MySQLDatabase();
$conn = openConnection($db);


$stmt = $db->prepareQuery($conn, 'SELECT id, username FROM membership');
$stmt->execute();


$stmt->bind_result($id, $username);


while ($stmt->fetch()) {
echo $id;
echo $username;
}


$db->closeConnection($conn, $stmt);

Mostafa_G2
یک شنبه 01 بهمن 1391, 16:35 عصر
یعنی کسی نیست کمک کنه ؟؟؟؟؟؟؟؟؟

امید امرایی
یک شنبه 01 بهمن 1391, 19:38 عصر
شما کلاسی با نام Database تعریف کردید که تمام متد هاش بدون بدنه تعریف شدند. اشکال همین جاس و این متعارف نیست.
اگه بنا دارید کلاس MySQLDatabase ملزم به پیاده سازی یک سری متد کنید باید اون رو از یک رابط پیاده سازی کنید. این یعنی Database باید یه Interface باشه نه کلاس.

Interface ها الزام آور هستند و معمولا دو کاربرد عمده دارن:


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

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


--------------------------------------
توصیه هایی در دنیای وب و دیجیتال (http://www.amraei.com)

Mostafa_G2
دوشنبه 02 بهمن 1391, 11:46 صبح
مرسی دوست عزیز
میشه یه مثال برنامه نویسی بزنید؟ اگه میشه در رابطه با این مسله یه کتاب با تعداد صفحه کم یا یک مقاله بهم معرفی کنید.
راستی اصلا چجور توابعی رو باید تو interface بنویسیم ؟ اگه ممکنه مثال بزنید.
بعدش اگه امکانش هست کد من رو تصحیح کنید.
ممنون میشم.