Class 需要一些关于解决方案/类设计的见解吗

Class 需要一些关于解决方案/类设计的见解吗,class,design-patterns,Class,Design Patterns,基本上我想要一门课,比如说“工作”,大致上是这样的 class Job { $jobId; $name; public function __construct($name) { $this->name = $name; } public function execute() { // excute some stuff here } public function setJobId() {

基本上我想要一门课,比如说“工作”,大致上是这样的

class Job {
    $jobId;
    $name;

    public function __construct($name) {
         $this->name = $name;
    }

    public function execute() {
        // excute some stuff here
    }

    public function setJobId() {
        $this->jobId = $this->generateId();
    }

    public function view() {
        return $this->name;
    }

    // Other stuffs
}
这些要求将是:

客户机应该能够实例化这个类,并且可以执行$job=newjob()和$job->view()来获取作业名称。但是,如果客户端希望执行它,则需要设置一个ID。请注意,此ID只应设置一次。此外,客户机可能只是想检索作业名称,而不想执行它


洞察力?也许我不应该让客户实例化类才能得到它的名字?

< p>我会考虑以下选项:

  • 删除
    setJobId()
    并在构造函数中分配作业标识符:

        ...
        public function __construct($name) {
            $this->name = $name;
            $this->jobId = $this->generateId();
        }
        ...
    
  • 删除
    setJobId()
    ,并在执行中分配作业标识符

        ...
        public function execute() {
            $this->jobId = $this->generateId();
            // execute some stuff here
        }
        ...
    
  • 确保
    setJobId()
    不会重新分配id,尽管我可能会将其重命名为更直观的名称,如
    prepare()

  • 如果你不做像1这样的事情。或者,您可以在
    execute()
    中检查
    jobId
    ,如果未设置,则引发错误或调用
    setJobId()
    -或其更性感的新版本
    prepare()
    ;^)


  • 那么
    generateId()
    方法呢?打电话什么的贵吗?有没有可能一个作业永远不会执行,因此不需要id?除非有理由不这样做,否则我认为应该在构造函数中执行行
    $this->jobId=$this->generateId()
    。是的,客户端可能只是想要一些关于作业的信息,但不执行它。这并不昂贵,但似乎是多余的,因为我们无论如何都不会执行它,因此我们不需要唯一的作业标识符来检索其执行结果,等等。是的,将作业id生成放在构造函数中可以工作,但感觉不是一个好的设计。
        ...
        public function prepare() {
            if (is_null($this->jobId)) {  // or however nullity is checked on PHP
                $this->jobId = $this->generateId();
            } else {
                // do nothing or raise exception
                // because I've just found out that PHP has exceptions
            }
        }
        ...