为代表一行的 class 中的每个 属性 设置一个 getter 是好的做法,还是我应该研究另一种方法?
Is it good practice to have a getter for every property in a class representing a row, or should I investigate another approach?
我有一个 NoteEntity
class 用来 代表我的 notes
table 中的一行 。我的框架 strictly 中的“(数据)实体”表示 stored/storable 数据条目 - 数据库行,如果您愿意的话。创建这样一个对象就像用 mysqli_fetch_array()
返回的数组初始化它一样简单,这需要我 将对象属性与我的 table 的列名称 匹配.
从父类继承的构造函数DataEntity
class:
PHP代码
public function __construct($row_array)
{
foreach ($row_array as $column => $value)
{
if (property_exists($this, $column))
{
$this->$column = $value;
}
else
{
trigger_error(get_class($this) . " has no attribute called '$column'.", E_USER_NOTICE);
}
}
}
如您所见,它所做的只是将相应的列映射到它们相应的对象属性。
这对我来说很好,因为 NoteEntity
class 仅定义一次,因此如果 table 列发生变化,很容易更改其内部工作方式。但这也需要我对 each 和 every 属性 使用 getter 方法,如果我不想我的整个代码取决于给定的 table 的列名。
问题如下:每个 属性 都有一个 getter 是好的做法,还是我应该研究另一种方法? 我在问这是从性能角度来看的,但我也希望尽可能保持我的代码可维护性。
我担心性能的原因是,如果它变得有点忙,快速获取属性会变成:
PHP代码
foreach ($notes as $note_entity)
{
$template->Process(array(
'note_name' => $note_entity->GetName(),
'note_ext' => array_pop(explode('.', $note_entity->GetFilename())),
'subject_id' => $note_entity->GetSubjectID(),
'subject_name' => $note_entity->GetSubject(),
'institute_id' => $note_entity->GetInstituteID(),
'institute_nick' => $note_entity->GetInstitute(),
// ...
));
}
... 对于几十个音符来说可能没问题,但预计每个请求的数量甚至会达到 千 ,这增加了 显着 函数调用开销。目前的版本使用起来非常方便,因为在代码的任何部分都不需要记住列名。
我想出的可能解决方案包括一种方法,即关联数组中每个 returns 或每个 属性 的子集。这有以下小缺点:
- 仅返回数据的一个子集会在
NoteEntity
和使用它的位置之间创建隐式逻辑依赖关系,如果所需的子集在调用位置之间有所不同,
- 返回所有属性会创建一个永远不会被使用的不必要的数据流,
- 更新列配置会增加维护成本,因为我们还需要更新返回数组的结构。
我认为这更多是一种设计偏好,但使用 getters/setters 有很多优点。
封装和隐藏内部结构通常是很好的做法。互操作性是使用 getter 和 setter 是一个好主意的另一个原因(即模拟变得容易得多)。
是否要对基元执行此操作尚有争议,但通常您不想通过直接引用它们来更新属性,尤其是不希望在外部引用它们。所以 getters/setters 是隔离它们的好方法。
您获得的优势远大于您即将失去的性能。
我有一个 NoteEntity
class 用来 代表我的 notes
table 中的一行 。我的框架 strictly 中的“(数据)实体”表示 stored/storable 数据条目 - 数据库行,如果您愿意的话。创建这样一个对象就像用 mysqli_fetch_array()
返回的数组初始化它一样简单,这需要我 将对象属性与我的 table 的列名称 匹配.
从父类继承的构造函数DataEntity
class:
PHP代码
public function __construct($row_array)
{
foreach ($row_array as $column => $value)
{
if (property_exists($this, $column))
{
$this->$column = $value;
}
else
{
trigger_error(get_class($this) . " has no attribute called '$column'.", E_USER_NOTICE);
}
}
}
如您所见,它所做的只是将相应的列映射到它们相应的对象属性。
这对我来说很好,因为 NoteEntity
class 仅定义一次,因此如果 table 列发生变化,很容易更改其内部工作方式。但这也需要我对 each 和 every 属性 使用 getter 方法,如果我不想我的整个代码取决于给定的 table 的列名。
问题如下:每个 属性 都有一个 getter 是好的做法,还是我应该研究另一种方法? 我在问这是从性能角度来看的,但我也希望尽可能保持我的代码可维护性。
我担心性能的原因是,如果它变得有点忙,快速获取属性会变成:
PHP代码
foreach ($notes as $note_entity)
{
$template->Process(array(
'note_name' => $note_entity->GetName(),
'note_ext' => array_pop(explode('.', $note_entity->GetFilename())),
'subject_id' => $note_entity->GetSubjectID(),
'subject_name' => $note_entity->GetSubject(),
'institute_id' => $note_entity->GetInstituteID(),
'institute_nick' => $note_entity->GetInstitute(),
// ...
));
}
... 对于几十个音符来说可能没问题,但预计每个请求的数量甚至会达到 千 ,这增加了 显着 函数调用开销。目前的版本使用起来非常方便,因为在代码的任何部分都不需要记住列名。
我想出的可能解决方案包括一种方法,即关联数组中每个 returns 或每个 属性 的子集。这有以下小缺点:
- 仅返回数据的一个子集会在
NoteEntity
和使用它的位置之间创建隐式逻辑依赖关系,如果所需的子集在调用位置之间有所不同, - 返回所有属性会创建一个永远不会被使用的不必要的数据流,
- 更新列配置会增加维护成本,因为我们还需要更新返回数组的结构。
我认为这更多是一种设计偏好,但使用 getters/setters 有很多优点。
封装和隐藏内部结构通常是很好的做法。互操作性是使用 getter 和 setter 是一个好主意的另一个原因(即模拟变得容易得多)。
是否要对基元执行此操作尚有争议,但通常您不想通过直接引用它们来更新属性,尤其是不希望在外部引用它们。所以 getters/setters 是隔离它们的好方法。
您获得的优势远大于您即将失去的性能。