Profile を抽象クラスにして、プロファイルの「種類」に関係なく、Profile からプロパティを取得するメカニズムを定義します。
プロファイル クラスには、おそらく魔法のメソッドを使用して、プロパティを取得するメソッドが含まれる場合があります (既に設定されているか、構築中に設定されている可能性があります) 。したがって、Profile を拡張するオブジェクトには、設定されたプロパティに応じて自身を「フォーマット」するメカニズムが既に備わっています。
それが助けになり、自分自身を明確にしたことを願っています。
アップデート:
これは、あなたが達成しようとしていると思われる種類の動作を達成しようとしたときに思いついたコードです。
まず、フォーマッタのインターフェースを定義しましょう。
/**
* Formatter interface
*
* @category Formatter
* @package Formatter
* @author Saul Martinez <saul@sharkwebintelligence.com>
* @copyright 2012 Shark Web Intelligence
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version 1.0
* @link http://www.sharkwebintelligence.com
*/
interface IFormatter
{
/**
* Object formatting.
*
* @return string
*/
public function format();
}
しかし、特別なことは何もありません。次に、この場合はプロファイルのフィールドまたはプロパティを保持する一種のヘルパーを定義しましょう。
/**
* Profile field.
*
* @category Formatter
* @package Profile
* @subpackage Field
* @author Saul Martinez <saul@sharkwebintelligence.com>
* @copyright 2012 Shark Web Intelligence
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version 1.0
* @link http://www.sharkwebintelligence.com
*/
class ProfileField
{
/**
* @var string $name Field name.
*/
public $name;
/**
* @var mixed $value Field value.
*/
public $value;
/**
* Factory method to create a profile field.
*
* @param string $name Field name.
* @param mixed $value Field value.
*
* @return ProfileField
*/
public static function factory($name, $value)
{
$field = new self();
$field->name = $name;
$field->value = $value;
return $field;
}
/**
* Format the profile field.
*
* @return string
*/
public function __toString()
{
return $this->name . ': ' . $this->value . PHP_EOL;
}
}
次のクラス、Profile
クラス、私はそれを少し柔軟にしようとしました:
/**
* Profile.
*
* @category Formatter
* @package Profile
* @author Saul Martinez <saul@sharkwebintelligence.com>
* @copyright 2012 Shark Web Intelligence
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version 1.0
* @link http://www.sharkwebintelligence.com
*/
abstract class Profile implements IFormatter
{
/**
* @var array $fields Profile fields.
*/
public $fields;
/**
* Constructor.
*
* - Set options.
*
* @param array $options Profile options.
*/
public function __construct($options)
{
if (is_array($options)) {
$this->setOptions($options);
}
}
/**
* Format implementation.
*
* @return string
*/
public function format()
{
$output = '';
foreach ($this->getFields() as $field) {
$output .= $field;
}
return $output;
}
/**
* Adds a field to the fields list.
*
* @param ProfileField $field Field to add.
*
* @return Profile Provides a fluent interface.
*/
public function addField(ProfileField $field)
{
$this->fields[] = $field;
return $this;
}
/**
* Set profile fields.
*
* @param array $fields Profile fields.
*
* @return Profile Provides a fluent interface.
*/
public function setFields(array $fields)
{
$this->fields = $fields;
return $this;
}
/**
* Get profile fields.
*
* @return array
*/
public function getFields()
{
return $this->fields;
}
/**
* Set profile options.
*
* @param array $options Profile options.
*
* @return Profile Provides a fluent interface.
*/
public function setOptions(array $options)
{
$methods = get_class_methods($this);
foreach ($options as $name => $value) {
$method = 'set' . ucfirst($name);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
return $this;
}
}
Profile
そして最後に、特定の動作を追加したい場合は、クラス メソッドのいずれかをオーバーライドできる学生プロファイル クラスです。
/**
* Student profile.
*
* @category Formatter
* @package Profile
* @subpackage Student
* @author Saul Martinez <saul@sharkwebintelligence.com>
* @copyright 2012 Shark Web Intelligence
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version 1.0
* @link http://www.sharkwebintelligence.com
*/
class StudentProfile extends Profile
{
}
StudentProfile
ここで、クラスをインスタンス化し、いくつかのフィールドを追加する必要があります。
$studentProfile = new StudentProfile(
array(
'fields' => array(
ProfileField::factory('Name', 'Buddy'),
ProfileField::factory('Birth date', '1983/05/05'),
ProfileField::factory('Graduation date', '2000/01/01'),
),
)
);
echo $studentProfile->format();
それが役に立てば幸いです。私は自分自身を明確にしました。
アップデート:
任意の言語で OOP を実装する場合、心に留めておくことが非常に重要だと思うことの 1 つは、YAGNIの原則です。
クラスを抽象化しているときに機能や動作を追加するのは「自然」に感じるかもしれませんが、機能でそれらが必要になる可能性があると「考える」という理由だけでそれらを追加することはお勧めできません。したがって、メソッドまたは機能を追加する必要があるかどうか、いつ追加する必要があるかをよく考えてください。