如何修改此代码以使用良好做法?(接口、特性、抽象类)



我决定学习PHP,看了一些基本教程,并制作了一个简单的脚本来尝试基本知识。脚本是有效的,但可能不是使用良好的实践编写的。

我应该在某个地方使用静态/私有/受保护的变量/函数吗?

我应该把变量从Trait移到其他地方吗?

我应该在每个类(VideoOrganizer,ImageOrganizer(上单独实现Interface,而不是使用带有Interface的抽象类吗?

或者其他可以做得更好的事情?

感谢

<?php
interface OrganizerInterface
{
public function organize($folder);
}

trait OrgnaizeTrait
{
public $filesInDir = "";
public $destinationFolder;
public $formats;
public function organize($folder)
{
echo "Destination folder: " . $this->destinationFolder . "n";
print_r($this->formats);
echo "Moving files from folder: " . $folder . "n";
}
}

abstract class Organizer implements OrganizerInterface
{
use OrgnaizeTrait;
}

class VideoOrganizer extends Organizer 
{
public $destinationFolder = '/videos';
public $formats = ['.avi', '.mov'];
}

class ImageOrganizer extends Organizer
{
public $destinationFolder = '/images';
public $formats = ['.jpg', '.png'];
}

class Application
{
public $organizer;
public function __construct(OrganizerInterface $organizer)
{
$this->organizer = $organizer;
}
}
$app = new Application(new VideoOrganizer());
$app->organizer->organize("/home/Tomas");

对于SO来说,这是一个有点过于开放的问题(它可能适合https://softwareengineering.stackexchange.com/更好一点(,但这里有几点:

  • 公共财产很糟糕,如果不是一直的话,你应该大部分时间都避免它们
  • 我不认为使用一种特质有什么意义(它们通常是糟糕设计的标志,在你的情况下似乎没有多大作用(
  • OrgnaizeTrait有一个打字错误:(
  • 如果根本不使用$filesInDir,它有什么意义?(我知道你的代码部分是伪代码,但仍然如此(
  • 如果不知道你到底想做什么,以及这些课程的目的是什么,很难给你一个好的答案

这里有一个可能的";"清洁剂";您的代码版本:

interface OrganizerInterface
{
public function organize(string $folder);
}
final class BasicOrganizer implements OrganizerInterface
{
private string $destinationFolder;
/** @var string[] */
private array $formats;
/**
* @param string[] $formats
*/
public function __construct(string $destinationFolder, array $formats)
{
$this->destinationFolder = $destinationFolder;
$this->formats = $formats;
}
public function organize(string $folder): void
{
echo "Destination folder: {$this->destinationFolder}n";
print_r($this->formats);
echo "Moving files from folder: {$folder}n";
}
}
final class Application
{
private OrganizerInterface $organizer;
public function __construct(OrganizerInterface $organizer)
{
$this->organizer = $organizer;
}
public function doStuffThatNeedsAnOrganizer(string $folder): void
{
// Do stuff here if needed
$this->organizer->organize($folder);
// Do more stuff here if needed
}
}
$videosOrganizer = new BasicOrganizer('/videos', ['.avi', '.mov']);
$imagesOrganizer = new BasicOrganizer('/images', ['.jpg', '.mov']);
$app = new Application($imagesOrganizer);
$app->doStuffThatNeedsAnOrganizer('/home/Tomas');

最新更新