我已经阅读了很多关于开发类的文章(我使用的是php),标签行: “可扩展,强大,可维护和可扩展”。
但作为一名初学者,我一直在创建用我的话说“刚刚抽象”的类。意思是我只是将一堆或重复的代码分开并将它们放在一个类中,并提供访问常见任务的方法。
问题是,我找不到让我的类可扩展的方法(我知道抽象类的概念等等,我甚至使用它们,但只是定义我的其他类将遵循的方法)。问题是,我总是发现自己编辑核心类只是为了增加功能。
有关使我的课程可扩展的任何提示吗? (我已经在google上搜索了这一切,弹出的所有内容都是抽象类,接口和OOP的解释,没有关于指针的讨论或者有关进行可扩展分类的一些技巧)。
哦,顺便说一句,对我很轻松,我已经开始了9个月前的“实际”oop编程(我从大学那里得到了关于OOP的理论,但他们让我们工作原则,因为它更快,它遇到该死的项目截止日期,并持续了4年,直到我毕业)。
答案 0 :(得分:2)
您应该查看图书Design Patterns: Elements of Reusable Object-Oriented Software
正如您所发现的那样,制作可扩展类的问题是将系统分解为有用且可重用的对象。
任务很困难,因为许多因素都会起作用:封装,粒度,依赖性,灵活性,性能,进化,可重用性等等。
您是在尝试为某些真实场景建模,还是在关注应用程序内部的通信/协作和依赖关系?
这是一个我认为有点展示你正在寻找的例子。当然有更多,更好的例子:
我想开发一个缓存系统,为我的开发人员提供一个简单的,标准化的API,无论他们在什么/哪里缓存某些东西。在缓存系统中(基本级别)我想要什么?
我想出了这个:
abstract class MyNs_Cache
{
abstract public function Set($key, $data, $ttl);
abstract public function Get($key);
abstract public function Delete($key, $ttl);
}
我的可扩展基类。然后我有三个缓存类MyNs_Cache_Fs
,MyNs_Cache_Apc
和MyNs_Cache_Memcache
class MyNs_Cache_Fs
{
...
public function Set($key, $data, $ttl)
{
// here I use fopen/fwrite/etc. to create the cached data
}
public function Get($key)
{
// here I retrieve the file from the filesystem (if it exists)
}
public function Delete($key) { ... }
}
这是相当直接的。它根据FileSystem实现缓存。它没有提供我原来课程之外的任何内容。
class MyNs_Cache_Apc
{
...
public function Set($key, $data, $ttl)
{
return apc_add($key, $data, $ttl); // NOT A FILESYSTEM CALL
}
public function Get($key) { ... } // you get the idea.
// This is specific to APC, so I add the functionality HERE
// NOT in my main Caching class.
public function PurgeCache()
{
return apc_clear_cache();
}
}
我的APC缓存在缓存系统中执行我想要的所有操作(设置/获取/删除),但它还提供清除整个缓存的功能(对于我的FileSystem缓存无用,而对于memcached则无法实现)
class MyNs_Cache_Memcache
{
// Memcached needs a pool of servers. APC and filesystem don't.
private $servers = array(..);
// It also uses a memcached object.
private $conn;
public function __construct()
{
$this->conn = new Memcached;
foreach ($this->$servers as $server)
$this->AddServer($server);
}
... // we do all the standard stuff using memcached methods
// We also want to be able to manage our connection pool
public function AddServer($server)
{
$this->conn->addServer(...);
}
// And in some cases, we use inc/dec from memcached
// APC doesn't have this, and it makes little sense in a filesystem
public function Increment($key) { ... }
}
现在我知道我总是可以获得一个缓存对象,只需使用$ obj-> Get('some_key'),我总会得到一个结果。
同样,我也可以访问我目前正在尝试使用的功能。
答案 1 :(得分:1)
您无需编辑核心类即可添加可覆盖子类中方法的功能,例如:
class A {
public function filter_string($str){
return str_replace ('foo', 'bar', $str);
}
}
class B extends A {
public function filter_string($str){
return str_replace ('machin', 'chose', parent::filter_string ($str));
}
}
$a = new A;
echo $a->filter_string('foo machin'); // echoes 'bar machin'
$b = new B;
echo $b->filter_string('foo machin'); // echoes 'bar chose'