首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于固体原理的PPT发生器

基于固体原理的PPT发生器
EN

Code Review用户
提问于 2018-06-20 18:15:09
回答 1查看 113关注 0票数 3

我想使用越来越多的固体,但仍然学习,我正在改进一个PPT生成器,并希望您的帮助应用坚实的原则在其中。

  • 每个幻灯片应该打印两张照片,第一张在左边,第二张在右边;
  • 如果最后一张照片是左边的照片,它应该放在中间;
  • 每一张照片下面都有一个文本;
  • 我将使用第三方PPT库来执行低级别的操作。

这就是我想出来的,只是为了传递这个想法,这个示例是用PHP编写的,但是我会接受任何编程语言的答案:

代码语言:javascript
复制
class Controller 
{
    $ppt = new Ppt(Ppt::DEFAULT_RESOLUTION, $background, $header, $footer);

    $ppt->writeSlides($photoCollection);

    $pptFile = $ppt->saveToFile();

    $ppt->deleteLocalTemporaryFiles();

    readfile($pptFile);
    unlink($pptFile);
}

class Ppt extends thirdPartyPptLib
{
    const DEFAULT_RESOLUTION = 'x';

    private $resolution;
    private $background;
    private $header;
    private $footer;

    public function __construct($resolution = null, $background = null, $header = null, $footer = null)
    {
        $this->resolution = $resolution;
        $this->background = $background;
        $this->header     = $header;
        $this->footer     = $footer;
    }

    public function writeSlides(\Traversable $photoCollection)
    {
        $i     = 0;
        $count = count($photoCollection);

        foreach ($photoCollection as $photoInfo) {
            $photoToLeft = $i % 2 == 0;
            $isLastPhoto = $i == ($count - 1);

            if ($isLastPhoto) {
                $slide = $this->newSlide();    
                $slide->addCenterPhotoInfo($photoInfo);    

            } else if ($photoToLeft) {
                $slide = $this->newSlide();    
                $slide->addLeftPhotoInfo($photoInfo);    

            } else {
                $slide->addRightPhotoInfo($photoInfo);    
            }       

            $i++;            
        }
    }

    private function newSlide()
    {
        $slide = parent->newSlide();

        if ($this->hasBackground()) {
            $slide->setBackground();
        }

        if ($this->hasHeader()) {
            $slide->setHeader();
        }

        if ($this->hasFooter()) {
            $slide->setFooter();
        }       

        return $slide;
    }
}

class Slide extends thirdPartyPptLibSlide
{
    public function addLeftPhotoInfo($photoInfo)
    {
        $this->addLeftPhoto($photoInfo->getPhoto());
        $this->addUnderlyingText($photoInfo->getText());
    }

    // functions addRightPhotoInfo and addCenterPhotoInfo very similar
}

我应该把它划分成不同的类吗?还是方法?我应该创建接口吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2018-06-20 18:18:30

可以从构造函数中删除属性的重载。这样可以提高代码的维护性和可读性。

一个改进的例子:

代码语言:javascript
复制
class Style {
    // Properties here    
}

class Ppt {
    public function __construct(Style $style) {
    }
}

现在,您只传递带有所有所需属性的样式对象。

票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/196910

复制
相关文章

相似问题

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