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
Language agnostic OOP:它什么时候是对象?_Language Agnostic_Oop - Fatal编程技术网

Language agnostic OOP:它什么时候是对象?

Language agnostic OOP:它什么时候是对象?,language-agnostic,oop,Language Agnostic,Oop,我正在努力理解对象定向。我当然有点理解,但有时我不是100%清楚。你如何决定什么应该变成一个对象(另一个大的整体对象的小对象部分),或者什么不值得成为一个对象,或者它应该只是那个大的整体对象的一个属性 对于一扇门,我猜想门把手应该是一个独立的物体,但是在你插入钥匙的中间那个部分也应该是一个独立的物体还是什么?这是一个简单的例子,所以我可以解释我的困惑。你可以用你的例子,如果它有助于你更好地表达你的观点 我在想,如果我想多次使用它,我应该把它变成一个对象。我认为这是解决这个问题的一种切实可行的方法

我正在努力理解对象定向。我当然有点理解,但有时我不是100%清楚。你如何决定什么应该变成一个对象(另一个大的整体对象的小对象部分),或者什么不值得成为一个对象,或者它应该只是那个大的整体对象的一个属性

对于一扇门,我猜想门把手应该是一个独立的物体,但是在你插入钥匙的中间那个部分也应该是一个独立的物体还是什么?这是一个简单的例子,所以我可以解释我的困惑。你可以用你的例子,如果它有助于你更好地表达你的观点

我在想,如果我想多次使用它,我应该把它变成一个对象。我认为这是解决这个问题的一种切实可行的方法,您同意吗?


谢谢

我建议您考虑一下如何使用它。想想你要做什么,你的“事情”,然后考虑什么是最简单的方法。有时更容易使其成为另一个对象的属性,有时更容易使其成为自己的新对象

没有通用的配方,可能有许多因素使一个解决方案更好。只考虑每一种情况。

添加:以门/门把手/钥匙孔为例,您将如何处理钥匙孔?以下是一些使锁孔成为单独对象符合逻辑的因素:

  • 您需要存储钥匙孔的许多属性,如大小、形状、方向、针脚数、钥匙是否可以转动一次或两次等
  • 门把手上可以有多个钥匙孔
  • 您希望为锁孔提供一些只读属性(如是否锁定),然后只允许通过特定方法(如以“key”对象为参数的“unlock”方法)对其进行修改
  • 键孔存储在一个单独的DB表中,每个DB行有一个键孔(因此,使键孔对象模仿DB结构可能是有意义的)
  • 您的系统中有一些方法可以优雅地实现,如果它们可以将锁孔作为参数
将其设置为属性的方案与此相反:

  • 每个门把手只能有一个钥匙孔,它只有一个或很少的属性
  • 钥匙孔与车门把手一起存储在DB中
  • 你通常不关心锁孔本身,你只想把它作为门把手的一个描述性属性(比如是否有锁孔)
      这取决于使用情况。举个例子,如果门把手是一个重要的部件,并且(可能)可以用在另一扇门上(或者“这个”门可以用不同的把手),那么它可能应该是一个物体


      另一方面,如果它只允许您打开和关闭门,那么它应该只是门对象的一部分。

      决定对象粒度的教科书方法是通过内聚

      如果对象的大多数方法对对象的大多数字段进行操作,则对象足够小(对于给定的“most”值)


      对象几乎从不太小。

      您还应该考虑需要多少子对象。门只有一个把手,不是四个或五个,也不是把手列表。子对象是否也有自己的属性?颜色或材料重要吗?那么最好将句柄作为一个单独的对象。

      一如既往,答案是不幸的:它取决于

      开始时,您有某种环境,并且希望为其创建一个模型。但你不会对每件事都建模,你会专注于重要的事情。这就是为什么我开始的原因:这要看情况。这取决于完成任务所需的细节

      拿汽车和它的轮子来说——如果你对一个城市进行建模并想要一些交通,你可以创建一个带有属性“numberOfWheels”的“car”类。但是如果你设计汽车,那么你很可能也想创建一个“轮子”类,并在“汽车”类中添加四个轮子

      经验法则:

    • 如果你想的是,它有不止一个属性,那么定义一个类
    • 如果你所想的有某种行为,定义一个类
    • 如果您所想的可能会增长或扩展,请定义一个类
    • 如果这样的话,你所想的,必须是可排序的,可比较的,定义一个类
    • 如果不确定,请定义一个类;) 编辑


      因为您强调了“多用途”方面:我不认为这是决定是否使用类的方面。想象一个简单的计数器,一个for循环中的整数值。你会使用这个概念数百次,但我敢打赌你永远不会想到将这个可怜的
      int
      封装到一个“计数器”类中——仅仅因为你多次使用“计数器的概念”。

      另一种看它的方式是门把手是否可以互换。我会让门把手成为一个单独的物体,是门上的财产。一个问题是,如果只有门可以有门把手,你是否想让门把手成为一个私人类。我个人不喜欢在这里使用私有类,但这是一种合理的可能性。通过使用单独的对象作为门上的属性,现在可以将旋钮实例从一个门(实例)移动到另一个门(就像在家中从一个门到另一个门交换旋钮)

      另一个有趣的方面是扩展您的层次结构。。。您可能有花式的旋钮、可锁定的旋钮等,这些都可以通过扩展基本门把手来实现


      我希望这有助于澄清您的困惑。

      一般来说,如果您需要更多信息,而不仅仅是一件事(不仅是旋钮的状态,还有它的颜色、确切位置,以及
      class Door
      {
          bool HasKeyHole;
      }
      
       class Door
       {
          Point KeyHoleCoordinates;
       }
      
      class KeyHole
      {
          Point Coordinates;
          bool OpensWithKey(Key key);
      }
      
      class Door
      {
          KeyHole Hole;
      }