gpt4 book ai didi

php - 如何创建一个 "genuinely extensible"类

转载 作者:搜寻专家 更新时间:2023-10-31 20:56:01 26 4
gpt4 key购买 nike

我已经阅读了很多关于开发类的文章(我使用的是 php),带有标记行:“可扩展、健壮、可维护和可扩展”。

但作为初学者,我一直在创建用我的话来说“只是抽象”的类。这意味着我只是将一堆或重复的代码分开,并将它们放在一个类中,并提供用于访问常见任务的方法。

问题是,我找不到使我的类可扩展的方法(我知道抽象类等的概念,我什至在使用它们,但只是为了定义我的其他类将遵循的方法)。问题是,我总是发现自己编辑核心类只是为了添加功能

关于使我的类可扩展的任何提示? (我用谷歌搜索了这个,弹出的所有内容都是对抽象类、接口(interface)和 OOP 的解释,没有关于指针的讨论或制作可扩展类的一些技巧)。

哦,顺便说一句,放轻松,我在 9 个月前就开始了“实际的”oop 编程(我所在的大学让我继续研究 OOP 的理论,但他们让我们按程序工作,因为它更快而且它遇到了该死的项目截止日期,这种情况持续了 4 年,直到我毕业)。

最佳答案

你应该看看这本书 Design Patterns: Elements of Reusable Object-Oriented Software

正如您所发现的,创建可扩展类的问题在于将系统分解为有用且可重用的对象。

The task is difficult because many factors come into play: encapsulation, granularity, dependency, flexibility, performance, evolution, reusability, and on and on.

您是在尝试模拟一些真实世界的场景,还是专注于应用程序内部的通信/协作和依赖关系?

这里有一个示例,我认为它可以展示您正在寻找的内容。当然还有更多更好的例子:

我想开发一个缓存系统,为我的开发人员提供一个简单、规范化的 API,无论他们在什么地方缓存什么东西。我在缓存系统中想要什么(在基本级别)?

  • 我希望能够缓存一些东西(设置)
  • 我希望能够取回那些东西(get)
  • 我希望能够使缓存失效(删除)

我想到了这个:

abstract class MyNs_Cache
{
abstract public function Set($key, $data, $ttl);
abstract public function Get($key);
abstract public function Delete($key, $ttl);
}

这是我的可扩展基类。然后我得到了三个缓存类 MyNs_Cache_FsMyNs_Cache_ApcMyNs_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) { ... }
}

这很简单。它根据文件系统实现缓存。除了我原来的类(class),它没有提供任何东西。

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 缓存在缓存系统中做我想做的一切(设置/获取/删除),但它也提供了清除整个缓存的能力(这对我的文件系统缓存没有用,并且对于 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') 并且我总能得到一个结果。

同样,我还可以访问特定于我当前尝试使用的功能。

关于php - 如何创建一个 "genuinely extensible"类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2353589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com