代码之家  ›  专栏  ›  技术社区  ›  Calvin

这是针对电子商务网站的面向对象设计吗?

  •  0
  • Calvin  · 技术社区  · 17 年前

    我对OOP/OOD很陌生,我意识到我有很多东西要学,所以我想向SO社区征求他们的意见。

    基本上,我使用的是Cakephp的MVC框架,我正在构建的在线商店只使用了两个模型、类别和产品,下面的create语句描述了这些模型、类别和产品:

    CREATE TABLE `categories` (
        `id` int(11) unsigned NOT NULL auto_increment,
        `name` varchar(255) default NULL,
        `parent_id` int(11) default NULL REFERENCES categories(`id`),
        `lft` int(11) default NULL,
        `rght` int(11) default NULL,
        PRIMARY KEY (`id`)
    );
    CREATE TABLE `products` (
        `id` int(11) unsigned NOT NULL auto_increment,
        `name` varchar(255) default NULL,
        `artist_id` int(11) default NULL REFERENCES artists(`id`),
        `description` text default NULL,
        `category_id` int(11) default NULL REFERENCES categories(`id`),
        `status` enum('in stock', 'pre-order', 'out of stock') NOT NULL,
        `price` decimal(6,2) default NULL,
        `picture` varchar(255) default NULL,
        `picture2` varchar(255) default NULL,
        PRIMARY KEY (`id`)
    );
    

    在线商店将包括:

    • 音乐
      • CD专区
      • DVD专区
    • 衣服
      • 帽衫
      • T恤衫
        • 长袖T恤
        • 性感睡裙
      • 帽子
    • 米歇尔默赫
      • 贴纸
      • 海报
      • 手提包
    • 下载
      • 随机铃声
      • MP3S

    基本上,这就是类别树的结构,尽管我们将来可能会添加新的类别。现在,所有产品都被平等地视为产品类对象,它们的类别ID是区分不同类型产品的唯一方法。在线商店也是网站的一部分。站点的其余部分包含诸如艺术家BIOS和Discographies之类的信息;因此,我还具有用于以下内容的模型/表: 艺术家 , 专辑 , 轨道 .

    这是个好方法吗?或者我应该为cd/t-shirts/mp3s/创建单独的子类。哪个继承自product类?我想把商店里的每张音乐CD都链接到唱片目录条目,以便自动生成曲目列表和其他产品描述信息。

    如果这不是解决问题的好方法,你会怎么做呢?另外,我应该在我的类别/产品类中包括哪些方法/属性?我应该只在类别树的叶节点中列出产品吗?

    编辑:
    显然,这个设计是不完整的。正如西里尔所指出的,product.price字段丢失了,仍然没有销售准备金。实际上,我仍在努力研究如何最好地设计和实现商店的这些方面。最有可能的是,我会有一个叫 命令 但实际上,由于我们根据装运目的地和订单所含内容采用不同的运费率,处理订单变得更加复杂。

    5 回复  |  直到 17 年前
        1
  •  1
  •   dr Hannibal Lecter    17 年前

    如果使用 polymorphic behavior . 这是一个简单的方法来保持所有 常见的 一个地方的数据(价格等)。

    或者,可以在表上使用相同的多态行为 属性 并添加任何特定于产品的属性(名称=>值对)。这完全取决于你头脑中的想法和数据量。

    如果您计划拥有一个大型数据库,第一个解决方案可能更好。

        2
  •  2
  •   eglasius    17 年前

    我更喜欢配置+行为方法而不是子类。

    这可以是类别级别的一些行为。根据场景的不同,有些行为可能与不同的产品类型相关联,例如适用于特定产品的某些行为,而不考虑类别。对于最后一部分来说,吸烟建议也很有意义,因为您可以将这些额外的行为与其他类别关联起来。这样,只要您处理已经编码的行为,就可以添加新的类别,指示它将支持哪些行为。

    一个小的变化是与类别相关联的行为列表,而不是位。

    附加的类将用于行为,而不是将其全部混合到产品类下。如果您需要为这些额外的事情关联一个UI,您可以将它与行为关联起来,而不管产品类型如何。

        3
  •  1
  •   esnoeijs    17 年前

    是的,您可能应该为不同类型的产品创建单独的子类,特别是如果它们具有特定于类型的功能。就像你提到的自动生成曲目列表。

    但是,即使没有这些,通过使用单独命名的产品类,在处理特定于产品类型的代码时,您将使代码更具可读性和逻辑性。

    您可能还需要创建一个更具体的数据库模型。 喜欢

    表:产品
    普罗迪特
    …普通的东西……

    服装产品
    普罗迪特
    …衣服特定的东西…

    音乐作品
    普罗迪特
    …特定于音乐的东西…

    产品介绍
    普罗迪特
    …商品特定的东西……

    因为音乐没有英寸大小,衣服也没有比特率。

        4
  •  1
  •   hannasm    17 年前

    您应该跳过Category_ID列,将关系建模为更像标记云。您将希望将每个产品与一个或多个类别关联。

    您应该跳过“艺术家ID”列,将关系建模为更像标记云。您最终会希望将某些产品与多个艺术家关联起来。

    分类是有日期的,你必须使用标签云。通常情况下,您不应该使用references语句创建表;除非表中的每一列都有references语句。

        5
  •  0
  •   Cyril Gupta    17 年前

    不,

    你绝对不应该创建单独的子类,除非你需要一些复杂的魔术(如定制T恤标志等),这是无法实现一个简单的类别划分。即使在这种情况下,在类别类(例如haslogo)中放入额外的标志字段也是安全的。

    但是设计还没有给我留下深刻的印象。哪种商店没有销售准备金?价格栏呢?

    为了灵活性,您还可以将图片放在单独的表中。

    您使用LFT/RGHT的目的是什么?您可以使用简单的inde属性来存储类别在树中的位置,但请记住,每次删除/添加类别时都需要更新。