一个班级有多少变量太多了?

时间:2009-01-14 16:03:45

标签: language-agnostic oop

我想知道是否有人为我正在编写的课程(OOP中的课程)设计了更好的设计。我们有一个脚本可以将共享文件夹统计信息放在CSV文件中。我正在阅读并将其放入Share类中。

我的老板想知道如下信息:

  • 文件总数
  • 文件总大小
  • Office文件数
  • Office文件的大小
  • Exe文件数
  • Exe文件的大小
  • 等....

我有一个带有$ numOfficeFiles,$ sizeOfficeFiles等变量的类,带有大量的get / set方法。有没有更好的方法来做到这一点?如果你的类有很多变量/属性,那么一般规则是什么?

我认为这是一个与语言无关的问题,但如果重要,我会使用PHP。

11 个答案:

答案 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)

没有“硬”限制。然而,OO设计的概念为couplingcohesion。只要你的课程松散耦合且具有高度凝聚力,我相信你可以根据需要选择尽可能多的成员/方法。

答案 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中是否正确,但你明白我的观点。事情将开始变得更清洁,更好地管理。