Tôi muốn viết một mô-đun (khuôn khổ cụ thể), có thể bao bọc và mở rộng Facebook PHP-sdk (https://github.com/facebook/php-sdk/). Vấn đề của tôi là - cách tổ chức các lớp học, theo một cách tốt đẹp.thay thế thừa kế đa cấp
Vì vậy, đi vào chi tiết - Facebook PHP-sdk bao gồm hai lớp:
- BaseFacebook - lớp trừu tượng với tất cả các sdk thứ không
- Facebook - kéo dài BaseFacebook, và thực hiện các mẹ phương pháp kiên trì liên quan đến trừu tượng với việc sử dụng phiên mặc định
Bây giờ tôi có một số chức năng để thêm:
- Thay thế lớp Facebook, được tích hợp với lớp phiên
- phương thức viết tắt, chạy các cuộc gọi api, tôi sử dụng chủ yếu Logic mọi thời gian,
- cấu hình, hút lên từ khuôn khổ lớp học, insted của truyền như params
- bộ nhớ đệm, tích hợp với mô-đun bộ nhớ cache khuôn khổ
tôi biết một cái gì đó đã đi rất sai, bởi vì tôi có quá nhiều thừa kế trông không bình thường lắm. Bao bọc mọi thứ trong một lớp "mở rộng phức tạp" cũng có vẻ quá nhiều. Tôi nghĩ rằng tôi nên có vài lớp học làm việc togheter - nhưng tôi gặp phải các vấn đề như: nếu lớp cache không thực sự mở rộng và ghi đè phương thức BaseFacebook :: api() - các lớp viết tắt và xác thực sẽ không thể sử dụng bộ nhớ đệm.
Có thể một số loại hình mẫu sẽ đúng ở đây? Làm thế nào bạn sẽ tổ chức các lớp học và phụ thuộc của họ?
EDIT 04.07.2012
Bits mã, liên quan đến chủ đề:
Đây là cách lớp cơ sở của Facebook PHP-sdk:
abstract class BaseFacebook {
// ... some methods
public function api(/* polymorphic */)
{
// ... method, that makes api calls
}
public function getUser()
{
// ... tries to get user id from session
}
// ... other methods
abstract protected function setPersistentData($key, $value);
abstract protected function getPersistentData($key, $default = false);
// ... few more abstract methods
}
Normaly Facebook lớp kéo dài nó, và làm suy yếu những phương pháp trừu tượng đó. Tôi thay thế nó với substitude tôi - lớp Facebook_Session:
class Facebook_Session extends BaseFacebook {
protected function setPersistentData($key, $value)
{
// ... method body
}
protected function getPersistentData($key, $default = false)
{
// ... method body
}
// ... implementation of other abstract functions from BaseFacebook
}
Ok, sau đó tôi mở rộng này nhiều hơn với các phương pháp tốc ký và các biến cấu hình:
class Facebook_Custom extends Facebook_Session {
public function __construct()
{
// ... call parent's constructor with parameters from framework config
}
public function api_batch()
{
// ... a wrapper for parent's api() method
return $this->api('/?batch=' . json_encode($calls), 'POST');
}
public function redirect_to_auth_dialog()
{
// method body
}
// ... more methods like this, for common queries/authorization
}
Tôi không chắc chắn, nếu đây không phải là quá nhiều cho một lớp đơn (ủy quyền/cách viết tắt/cấu hình). Sau đó, có một lớp mở rộng khác - bộ nhớ cache:
class Facebook_Cache extends Facebook_Custom {
public function api()
{
$cache_file_identifier = $this->getUser();
if(/* cache_file_identifier is not null
and found a valid file with cached query result */)
{
// return the result
}
else
{
try {
// call Facebook_Custom::api, cache and return the result
} catch(FacebookApiException $e) {
// if Access Token is expired force refreshing it
parent::redirect_to_auth_dialog();
}
}
}
// .. some other stuff related to caching
}
Hiện công việc này khá nhiều. Ví dụ mới của Facebook_Cache cho tôi tất cả các chức năng. Viết tắt phương pháp từ Facebook_Custom sử dụng bộ nhớ đệm, bởi vì Facebook_Cache overwrited api() phương pháp.Nhưng đây là những gì đang làm phiền tôi:
- Tôi nghĩ rằng đó là thừa kế quá nhiều.
- Đó là tất cả rất chặt chẽ coupled - như nhìn như thế nào tôi đã chỉ định 'Facebook_Custom :: api' thay vì 'cha mẹ: api', để tránh api() phương pháp vòng lặp trên lớp Facebook_Cache mở rộng.
- Mớ hỗn độn và sự xấu xí chung.
Vì vậy, một lần nữa, điều này có hiệu quả nhưng tôi chỉ hỏi về các mẫu/cách thực hiện điều này một cách gọn gàng và thông minh hơn.
vui lòng cung cấp thêm một số chi tiết để tìm hiểu thêm giải pháp .. –
Tôi đã thêm các bit mã, lỗi mà mất nhiều thời gian. – Luigi
Nhân tiện; đa thừa kế là một lớp mở rộng nhiều hơn một lớp khác. Đó là một cái gì đó hoàn toàn khác. – Sherlock