【问题标题】:Design Technique: How to design a complex system for processing orders, products and units [closed]设计技术:如何设计一个复杂的系统来处理订单、产品和单位 [关闭]
【发布时间】:2010-04-15 15:11:53
【问题描述】:

编程很有趣:我通过尝试简单的挑战、阅读一些书籍和遵循一些教程了解到这一点。我能够掌握使用 OO 编写的概念(我在 Ruby 中这样做),并自己编写了一些代码。但让我烦恼的是,我觉得我在重新发明轮子:我没有接受过教育或找到一本书(一本免费的)来解释我为什么而不是如何,我已经学会了来自 A 团队的人认为,正是计划使它走到了一起。因此,凭借我的 nuby Ruby 技能,我决定编写一个虚拟商店。我想出了以下几点:

我的虚拟商店将拥有:

  • 产品和服务
  • 库存
  • 订单和发货
  • 客户

现在这一点都不复杂。在一些很酷的工具(CMapTools)的帮助下,我画出了一些概念,但很快(由于我在设计方面的经验不足),我的设计开始咬我。我的第一个产品线是虚拟“笔记本电脑”。所以,我创建了一个类(Ruby):

class Product
  attr_accessor :name, :price
  def initialize(name, price)
    @name = name
    @price = price
  end
end

可以通过执行 (IRb) 来实例化

x = Product.new("Banana Pro", 250)

因为我希望我的虚拟客户能够购买不止一种产品或各种配置,所以我发现我需要某种“订单”机制。

class Order

  def initialize(order_no)
    @order_no = order_no
    @line_items = []
  end 

  def add_product(myproduct)
    @line_items << myproduct
  end

  def show_order()
    puts @order_no
    @line_items.each do |x|
     puts x.name.to_s + "\t" + x.price.to_s
    end 
  end
end 

可以通过执行 (IRb) 来实例化

   z = Order.new(1234)
   z.add_product(x)
   z.show_order

太好了,我现在有一个非常简单的订购系统,允许我将产品添加到订单中。但是,我真正的问题来了。

如果我的产品有三种型号(经济型、商业型、炫耀型)怎么办?还是我的产品由不同的单元组成(更大的屏幕、更好的键盘、不同的操作系统)?当然,我可以将它们制成三个独立的产品,或者为我的产品类别增加复杂性,但我正在寻找设计可在现实世界中使用的灵活产品对象的最佳实践,以促进复杂的系统。

如果我的语法和拼写有错误,我深表歉意,因为英语不是我的母语,我花时间检查我能理解和正确翻译的程度!

感谢您的回答、cmets 和反馈!

【问题讨论】:

    标签: ruby oop


    【解决方案1】:

    我发现了一件很酷的事情:使用整数是其中之一,但是使用字符串格式将它们转换为更好的货币格式

    puts "%s : $ %.2f" % [@name.to_s, @price]
    

    您也可以使用 printf,但它看起来比闪亮的 Ruby 更 C-ish。还了解到我可以将小单元作为单独的对象并将它们放在一个数组中。

    def initialize(name)
      @my_name = name
      @my_stack = []
    end
    
    def add_unit(unit)
        if @my_stack.length < 8
            @my_stack << unit
            puts "Added unit"
        else
            puts "Only room for 8 units."
        end
    
    end
    

    【讨论】:

      【解决方案2】:

      更多的发现,读了一堆令人眼花缭乱的严肃书籍。但后来我想起了去年的一些记忆,当时我在做一些 nuby web 开发和学习一些 Rails 的组合。我想到了CRUD!所以,我认为所有对象都需要一个 CRUD 接口。我仍然想知道通过将实例变量设置为 nil 来销毁是否会使其标记为垃圾收集。我使用此类添加到平衡数组中。我认为使用 CRUD 方法是通向传统 API 的第一步。

      class Product
      
          attr_accessor :my_name, :my_description, :my_amount
      
          # Create
          def initialize(name, description, amount)
              @my_name = name
              @my_description = description
              @my_amount = amount
          end
      
          # Read/Show
          def show
              x = [@my_name, @my_description, @my_amount] 
          end
      
          # Update
          def alter(name, description, amount)
              @my_name = name
              @my_description = description
              @my_amount = amount 
          end
      
          # Destroy
          def clean
              @my_name = nil
              @my_description = nil
              @my_amount = nil
          end
      
          # Diagnose is Development/Test Mode 
          def diagnose()
           puts "initialize(name, description, amount)"
           puts "{#@my_name} :: {#@my_description} :: {#@my_amount}"
           puts "%s :: %s :: %.2f" % [@my_name, @my_description, @my_amount] 
          end
      
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-22
        • 2022-08-04
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多