【问题标题】:The properly OOP approach in operation of lists? [closed]列表操作中正确的 OOP 方法? [关闭]
【发布时间】:2020-10-07 15:22:37
【问题描述】:

我有一个面向对象的问题,例如,有列表(数组)。

需要一种机制来添加(保存)和删除每个数组中的选定值。输出应该是其选定元素的每个数组。

数组的添加逻辑可能不同。 例如,arr1 数组,在添加到选定列表之前,满足某个条件,而其他条件则不满足。

我的想法正确吗?

数组arr1, arr2, arr3 - 数据模型。他们里面有任何类型的数据。 执行器类必须负责对数组的操作,它还允许您将项目添加到选定(收藏夹)列表中并从中删除。

问题 1 - 在哪里存储每个数组的选定元素列表?

问题 2 - 如果 ArrayHandler 类的逻辑是正确的,当 add 方法的逻辑针对不同的数组时,我会遇到问题。

在这种情况下,我不知道如何检查,是不是那个数组,在添加到选定列表之前需要额外检查。

class ArrayHandler {
    add (element) {
           // How to distinguish which input array is here to do the check before adding?
     if (element is from arr1) {
        return;
     }

      if (element is from arr2) {
          // add 
      }

    }
}

【问题讨论】:

  • PHP 还是 TypeScript?
  • 没关系,我会尝试在这两个工具上实现这一点,我只是想掌握一个正确的原则
  • Standard PHP Library (SPL) 有很多你可能想看的数据结构和接口,你可以在方法中添加类型提示。但是,老实说,我不明白你的疑问是什么,或者即使它实际上是关于 PHP 的。
  • 没看懂逻辑应该挂了才进入的意思
  • 问题不在于工具,不在头脑中,不在 OOP 原则和责任范围内。我只是将数组元素添加到选定列表的类似逻辑,但是某些数组在添加到选定列表之前具有添加条件。

标签: typescript oop design-patterns polymorphism solid-principles


【解决方案1】:

我会尽量简单地回答你。如果有不清楚的地方请告诉我。

问题 1 - 将每个数组的选定元素列表存储在哪里?

Answer: 如果数组的个数(也就是你说的 3 个)是固定的,那么只需要类的三个成员,每个成员代表数组,如果不是,则使单个成员具有 2D 数组类型和每个项该数组包含您的数据数组。


问题 2 - 如果 ArrayHandler 类的逻辑是正确的,当 add 方法的逻辑针对不同的数组时,我会遇到问题。

如何区分是哪个输入数组在这里做添加前的检查?

在哪个数组中添加,如果只有一个添加函数,则此信息必须在要添加的项目中。否则,所有数组都会有单独的 add 函数,实现它们的逻辑。

如果每个特定数组的添加逻辑完全不同,那么最好分开为各个数组提供不同的添加功能。

您只能在类外部公开一个数组函数,并且可以在公开的单个 add 函数内调用。相同的条件将用于调用它们对应的添加函数。


例子

type Genre = 'horror' | 'romantic' | 'actions';

interface TMovie {
   name: string;
   genre: Genre;
}

class Movies {

   constructor() {
      this.romantic = [];
      this.horror = [];
      this.action = [];
   }

   romantic: TMovie[];
   horror: TMovie[];
   action: TMovie[];

   add(item:TMovie) {
      switch (item.genre) {
         case 'actions': this.addToAction(item); break;
         case 'horror': this.addToHorror(item); break;
         case 'romantic': this.addToRomantic(item); break;
      }
   }

   private addToHorror(movie: TMovie) {
      // Some custom logic
      this.horror.push(movie);
   }

   private addToAction(movie: TMovie) {
      // Some custom logic
      this.action.push(movie);
   }

   private addToRomantic(movie: TMovie) {
      // Some custom logic
      this.romantic.push(movie);
   }

}

let a = new Movies();

a.add({ genre: 'actions', name: "Parker" });

Playground Link

【讨论】:

  • 谢谢,这对我很有用,在哪里存储数组的选定元素?以及如何在具有不同逻辑的类中制作方法add()?我不想为每个数组创建不同的类,其中添加的逻辑是不同的。因为它可能是很多数组
  • 那我再举个例子。
  • 我打算用TS来写。
  • 我不确定只需要一个或多个类,类应该存储数组的选定元素,删除它们,添加,但是 add() 方法可能有不同的逻辑取决于传入的数组。 1. 方法允许向选定元素列表添加一些唯一元素 2. 方法允许仅添加数组的一个元素,如果使用尝试添加相同的元素 add() 应该从选定列表中删除它
  • 谢谢,如果我有另一个列表,不仅仅是电影,例如水果列表,汽车模型?我的名单是:let arr1 = [1,2,3]; let arr2 = [{id: 1, value: "T"}]; let arr3 = [{id: 1, text: "VALUE"}]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2011-10-02
  • 2019-10-31
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多