我想知道是否有人为我正在编写的课程(OOP中的课程)设计了更好的设计。我们有一个脚本可以将共享文件夹统计信息放在CSV文件中。我正在阅读并将其放入Share类中。
我的老板想知道如下信息:
我有一个带有$ numOfficeFiles,$ sizeOfficeFiles等变量的类,带有大量的get / set方法。有没有更好的方法来做到这一点?如果你的类有很多变量/属性,那么一般规则是什么?
我认为这是一个与语言无关的问题,但如果重要,我会使用PHP。
答案 0 :(得分:8)
有时,数据可以只是数据:
files = {
'total': { count: 200, size: 3492834 },
'office': { count: 25, size: 2344 },
'exe': { count: 30, size: 342344 },
...
}
答案 1 :(得分:8)
每当我在课堂上看到超过5或6个非最终变量时,我就会感到厌倦。
有可能他们应该按照Outlaw Programmer的建议安排在较小的班级。它也很有可能被放置在哈希表中。
这是一个很好的经验法则:如果你有一个除了setter和getter之外什么都没有的变量,你就拥有DATA而不是代码 - 将它从你的类中取出并放入集合或其他东西中。
拥有一个带有setter和getter的变量只意味着你从不对它做任何事情(它的数据)或者操纵它的代码在另一个类中(糟糕的OO设计,将变量移动到另一个类)。
请记住 - 作为类成员的每一段数据都是您必须编写特定代码才能访问的内容;例如,当您将其从对象传输到GUI上的控件时。
我经常使用名称标记GUI控件,以便我可以遍历集合并自动将数据从集合传输到屏幕并返回,从而显着减少样板代码;将数据存储为成员变量会使这个过程变得更加复杂(需要反思)。
答案 2 :(得分:3)
“一个班级应该做一件事,做得好”
如果你没有违反这条规则,那么我会说没有太多。
但这取决于。
如果太多意味着100,那么您可能希望将其分解为数据类和集合,如下面的编辑所示。
然后你只有一次获取/设置操作,但这种“懒惰”有利有弊。
修改强>
乍一看,你有一对变量,Count和Size。 应该有另一个班,例如带有count和class的FileInfo,现在你的frist类只有FileInfo类。
您也可以输入文件类型,例如“全部”,“执行”。 。 。在文件信息类上。 现在,父类成为FileInfo对象的集合。
就我个人而言,我想我会这样做。
答案 3 :(得分:1)
我认为答案是“没有太多的变数。”
但是,如果这些数据将被保留一段时间,您可能只想将其放入数据库并使您的函数调用数据库。
我假设您不想在每次被要求时重新计算所有这些值。
答案 4 :(得分:1)
每个类的“最大变量”计数实际上是对所讨论的类有意义的数据的函数。如果一个类确实存在X个不同的值,并且所有数据都是相关的,则应该是您的结构。根据使用的语言创建可能有点乏味,但我不会说你不应该超过任何“限制”。这取决于目的。
答案 5 :(得分:1)
听起来你可能有很多重复的代码。你想要一堆不同类型的文件数和文件大小。您可以从看起来像这样的类开始:
public class FileStats
{
public FileStats(String extension)
{
// logic to discover files goes here
}
public int getSize() { }
public int getNumFiles() { }
}
然后,在您的主类中,您可以拥有所需的所有文件类型的数组,以及这些帮助程序对象的集合:
public class Statistics
{
private static final String[] TYPES = { "exe", "doc", "png" };
private Collection<FileStats> stats = new HashSet<FileStats>();
public static void collectStats()
{
stats.clear();
for(String type : TYPES)
stats.add(new FileStats(type));
}
}
您可以通过将参数传递给getter方法来清理API:
public int getNumFiles(String type)
{
return stats.get(type).getNumFiles();
}
答案 6 :(得分:0)
答案 7 :(得分:0)
就在我瞥了一眼:
如果你保留一个包含所有文件名的数组,那么所有这些变量都可以动态计算。
答案 8 :(得分:0)
也许我不理解目标,但为什么要使用变量将所有值加载到内存中,只是将它们转储到csv文件中(何时?)。我更喜欢无状态监听器到目录并立即将值写入csv。
答案 9 :(得分:0)
这更像是一个可读性问题。
我会把所有数据都包装成一个数组。并且只使用一对get / set方法。
类似的东西:
class Test()
{
private $DATA = array();
function set($what,$data) {
$DATA[$what] = $data;
}
function get($what) {
return $this->DATA[$what];
}
}
答案 10 :(得分:0)
我总是试着将Class视为“我的容器名称”或我要计算的“任务名称”。类中的方法是任务的“动作”部分。
在这种情况下,您似乎可以开始将事物分组,例如您多次重复数字和尺寸操作。为什么不创建其他类继承的超类,例如:
class NameOfSuperClass {
public $type;
function __construct($type) {
$this->type = $type;
$this->getNumber();
$this->getSize();
}
public function getNumber() {
// do something with the type and the number
}
public function getSize() {
// do something with the type and the size
}
}
Class OfficeFiles extends NameOfSuperClass {
function __construct() {
$this->_super("office");
}
}
我不确定这在PHP中是否正确,但你明白我的观点。事情将开始变得更清洁,更好地管理。