Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 有多少变量对于一个类来说太多了?_Language Agnostic_Oop - Fatal编程技术网

Language agnostic 有多少变量对于一个类来说太多了?

Language agnostic 有多少变量对于一个类来说太多了?,language-agnostic,oop,Language Agnostic,Oop,我想看看是否有人对我正在编写的类(如中的类)有更好的设计。我们有一个脚本,它将共享文件夹的统计信息放入一个文件中。我正在读这篇文章,并把它放在分享课上 我的老板想知道以下信息: 文件总数 文件的总大小 办公室文件的数量 办公室文件的大小 Exe文件数 Exe文件的大小 等等 我有一个带有变量的类,比如$numoficefiles、$sizeOfficeFiles等等,还有大量的get/set方法。难道没有更好的办法吗?如果您有一个包含很多变量/属性的类,那么一般规则是什么 我认为这是一个语言

我想看看是否有人对我正在编写的类(如中的类)有更好的设计。我们有一个脚本,它将共享文件夹的统计信息放入一个文件中。我正在读这篇文章,并把它放在分享课上

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

  • 文件总数
  • 文件的总大小
  • 办公室文件的数量
  • 办公室文件的大小
  • Exe文件数
  • Exe文件的大小
  • 等等
我有一个带有变量的类,比如$numoficefiles、$sizeOfficeFiles等等,还有大量的get/set方法。难道没有更好的办法吗?如果您有一个包含很多变量/属性的类,那么一般规则是什么

我认为这是一个语言不可知的问题,但如果有关系的话,我使用的是PHP。

我认为答案是“没有太多变量。”

但是,如果这些数据要保留一段时间,您可能只想将其放入数据库中,并对数据库进行函数调用

我假设您不想在每次被要求时重新计算所有这些值。

每个类的“最大变量”计数实际上是数据对所讨论的类有意义的函数。如果一个类确实有X个不同的值,并且所有数据都是相关的,那么这应该是您的结构。根据所使用的语言进行创建可能有点乏味,但我不会说有任何“限制”是不应该超过的。它是由目的决定的。

“一个班级应该做一件事,并且把它做好。”

如果你没有违反这条规则,那么我会说没有太多

但这要视情况而定

如果“太多”是指100,那么您可能希望将其分解为数据类和集合,如下面的编辑所示

那么您只有一个get/set操作,但是这种“懒散”有其优点和缺点

编辑:

再看一眼,就可以看到变量对、计数和大小。 应该有另一个类,例如带有count和class的FileInfo,现在您的第一个类只有FileInfo类

您也可以将文件类型,例如“All”、“Exe”。在文件信息类上。 现在父类成为FileInfo对象的集合


就我个人而言,我认为我会这么做。

没有“硬”限制。然而,OO设计确实有和的概念。只要您的类是松散耦合和高度内聚的,我相信您可以使用所需的任意多的成员/方法。

仅从我所看到的:


如果您保留一个包含所有文件名的数组,那么所有这些变量都可以动态计算。

也许我不明白目标,但为什么您要使用变量将所有值加载到内存中,只是为了将它们转储到csv文件(何时?)。我更喜欢无状态侦听器而不是目录,并将值立即写入csv

有时,数据可能只是数据:

files = {
   'total':  { count: 200, size: 3492834 },
   'office': { count: 25, size: 2344 },
   'exe':    { count: 30, size: 342344 },
   ...
}

这更像是一个可读性问题

我会将所有数据包装到一个数组中。并且只使用一对get/set方法

比如:

class Test()
{
    private $DATA = array();

    function set($what,$data) {
       $DATA[$what] = $data;
    }

    function get($what) {
        return $this->DATA[$what];
    }
}

我总是试图将类看作是我要计算的“容器名称”或“任务名称”。类中的方法是任务的“操作”部分

在这种情况下,您似乎可以开始将事情分组在一起,例如,您多次重复数字大小操作。为什么不创建一个其他类继承自的超类,例如:

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中是否正确,但你明白我的意思了。事情将开始变得更干净、更易于管理。

听起来您可能有大量重复的代码。您需要一系列不同类型的文件的#数量和大小。您可以从如下所示的类开始:

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));
    }
}

每当我在一个类中看到超过5或6个非最终变量时,我就会感到不安

很可能他们应该被放在一个较小的类中,正如非法程序员所建议的那样。也有一个很好的机会,它可以被放在一个哈希表中

这里有一个很好的经验法则:如果你有一个变量,它只有一个setter和一个getter,那么你有数据,而不是代码——把它从你的类中取出,放到一个集合或其他地方

拥有一个带有setter和getter的变量只意味着要么你从未对它做过任何事情(它的数据),要么操纵它的代码在另一个类中(糟糕的OO设计,将变量移动到另一个类)

记住——作为类成员的每一段数据都必须编写特定的代码才能访问;例如,当您将其从对象传输到GUI上的控件时


我经常用一个名字标记GUI控件,这样我就可以迭代一个集合,并自动地将数据从集合传输到屏幕和屏幕,大大减少了样板代码;将数据存储为成员变量会使这个过程更加复杂(需要反射)。

我认为变量与字典应该与对象的稀疏性联系起来。如果您在一个永远不会有空白字段的类上使用字典,那么您只是在浪费空间并引入潜在的bug。在这种情况下,我会说数据不够稀疏。C马丁:我自己对字典不满意,更改了答案,以便有一个更简洁的选择。肯定有太多变量的事情-比照上帝类,比照stackOverflowExceptionJimmy,那是什么语言?虽然我也不认识你的语言示例,我完全同意让数据成为数据。把它放到散列中。永远不要创建一个没有业务逻辑方法的类。然后你可能会有一个类来处理你的数据……好吧,你抓到我了,我喜欢无缘无故地输入随机符号。雷莫
public int getNumFiles(String type)
{
    return stats.get(type).getNumFiles();
}