首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构- Removing开关语句

重构- Removing开关语句
EN

Software Engineering用户
提问于 2019-07-16 12:26:22
回答 1查看 299关注 0票数 0

有一个基类Product,它具有产品应该具有的所有泛型属性和方法。

代码语言:javascript
复制
abstract class Product
{   
    public abstract function process();
}

现在,这些是少数几种产品,可能有,也可能没有类似的逻辑。

代码语言:javascript
复制
class Shirt extends Product
{
    public function process()
    {
        return 0;
    }
}

class Trouser extends Product
{
    public function process()
    {
        return 1;
    }
}

class PocketSquare extends Product
{
    public function process()
    {
        return 2;
    }
}

我使用switch语句来区分和初始化对象。

代码语言:javascript
复制
$products = $db->query("SELECT * FROM products LIMIT 10");
foreach ($products as $key => $product) {
    switch ($product->type) {
        case 'shirt':
            $products[$key] = new Shirt($product);
            break;
        case 'trouser':
            $products[$key] = new Trouser($product);
            break;
        case 'pocketsquare':
            $products[$key] = new PocketSquare($product);
            break;
    }   
}

有什么办法避免开关语句吗?或者有什么更好的方法?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-07-16 12:45:38

对此,常见的替代方法是对解决方案采取声明式的方法:用lambdas的hashmap替换那个switch语句。

我已经很多年没有使用PHP了,所以我可能有以下语法错误,但是您可能会这样做:

代码语言:javascript
复制
$productsMap = array (
    'shirt' => function ($p) { return new Shirt($p); },
    'trouser' => function ($p) { return new Trouser($p); },
    'pocketsquare' => function ($p) { return new PocketSquare($p); }

);

...

$products = $db->query("SELECT * FROM products LIMIT 10");

foreach ($products as $key => $product) {
    $products[$key] = $productsMap[$product->type]();
}
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/394747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档