代码之家  ›  专栏  ›  技术社区  ›  SW Jeong

UML 2.0序列图深度

  •  0
  • SW Jeong  · 技术社区  · 7 年前

    我正在做我的期中作业,为一个简单的java程序创建一个序列图。然而,我遇到了一个问题,我无法决定将哪个元素放在图中,以及忽略哪个元素。如果可以帮助回答这个问题,我将发布一个JAVA代码。

    public class TestPOS {
    public static void main(String[] args) {
        // POST 객체를 준비
        Store store = new Store();
        ProductCatalog catalog = new ProductCatalog();
        catalog.addSpec(1, new ProductSpec(1, "pencil", 1000));
        catalog.addSpec(2, new ProductSpec(2, "eraser", 500));
        catalog.addSpec(3, new ProductSpec(3, "fountain pen", 50000));
        POST post = new POST(store, catalog);
    
        // 첫 번째 판매
        post.enterItem(1, 12);
        post.enterItem(2, 4);
        post.enterItem(3, 1);
    
        post.makePayment();
    
        post.endSale();
    
        // 두 번째 판매
        post.enterItem(1, 2);
        post.enterItem(2, 1);
    
        post.makePayment();
    
        post.endSale();
    
        // 출력을 보여주어 이해를 돕기위한 코드
        for (Sale sale : store.completedSales) {
            System.out.println(sale.getDate());
            sale.printLineItems();
            System.out.println("total = " + sale.getTotal());
        }
      }
    }
    

    这是它调用enterItem()、makePayment()和endSale()的主要位置。任务是为上述三个功能创建序列图。我会把每节课发到下面。

    -----------------------------------------------------------
    import java.util.Date;
    public class POST {
        private Store store;
        private ProductCatalog catalog;
        private Sale sale = null;
    
        public POST(Store store, ProductCatalog catalog) {
            this.store = store;
            this.catalog = catalog;
        }
    
        public void enterItem(int upc, int qty) {
            if (sale == null) {
                Date date = new Date(System.currentTimeMillis());
                sale = new Sale(date);
            }
            ProductSpec s = catalog.spec(upc);
            sale.makeLineItem(s, qty);
        }
    
        public void makePayment() {
            if (sale != null) sale.makePayment();
        }
    
        public void endSale() {
            store.addCompleteSale(sale);
            sale = null;
        }
    }
    -----------------------------------------------------------
    import java.util.ArrayList;
    public class Store {
        protected ArrayList<Sale> completedSales = null;
    
        public Store() {
            completedSales = new ArrayList<Sale>();
        }
    
        public void addCompleteSale(Sale sale) {
            completedSales.add(sale);
        }
    }
    -----------------------------------------------------------
    import java.util.ArrayList;
    import java.util.Date;
    public class Sale {
        private Date date;
        private ArrayList<SalesLineItem> lineItem = null;
        private Payment payment = null;
    
        public Sale(Date date)
        {
            this.date = date;
            lineItem = new ArrayList<SalesLineItem>();
        }
    
        public void makeLineItem(ProductSpec s, int qty) {
            SalesLineItem item = new SalesLineItem(s, qty);
            lineItem.add(item);
        }
    
        public int getTotal() {
            int total = 0;  
            for (SalesLineItem item : lineItem) {
                total += item.getSubTotal();
            }
            return total;
        }
    
        public void makePayment() {
            int total = this.getTotal();
            payment = new Payment(total);   
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public Date getDate() {
            return date;
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public void printLineItems() {
            for (SalesLineItem item : lineItem) {
                System.out.println("upc : " + item.getItemUpc() +", name : " + item.getItemName() + ", price : "
                        + item.getItemPrice() + ", quantity : " + item.getQuantity());
            }
        }
    }
    -----------------------------------------------------------
    public class Payment {
        private int amount;
    
        public Payment(int amount) {
            this.amount = amount;
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public int getAmount() {
            return amount;
        }
    }
    -----------------------------------------------------------
    public class SalesLineItem  {
        private int quantity;
        private ProductSpec spec;
    
        public SalesLineItem(ProductSpec spec, int quantity) {
            this.spec = spec;
            this.quantity = quantity;
        }
    
        public int getSubTotal() {
            int price = spec.getPrice();
            return price * quantity;
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public int getItemUpc() {
            return spec.getUpc();
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public String getItemName() {
            return spec.getName();
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public int getItemPrice() {
            return spec.getPrice();
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public int getQuantity() {
            return quantity;
        }
    }
    -----------------------------------------------------------
    import java.util.HashMap;
    public  class ProductCatalog  {
        private HashMap<Integer, ProductSpec> specTable = new HashMap<Integer, ProductSpec>();
    
        public void addSpec(int upc, ProductSpec spec) {
            specTable.put(upc, spec);
        }
    
        public ProductSpec spec(int upc) {
            return specTable.get(upc);
        }
    }
    -----------------------------------------------------------
    public class ProductSpec  {
        private int upc;
        private String name;
        private int price;
    
        public ProductSpec(int upc, String name, int price) {
            this.upc = upc;
            this.name = name;
            this.price = price;
        }
    
        public int getPrice() {
            return price;
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public int getUpc() {
            return upc;
        }
    
        // 출력을 보여주어 이해를 돕기위한 메소드, 클래스 다이어그램에 반영하지 않음
        public String getName() {
            return name;
        }
    }
    

    不要介意代码中的韩语,它们只是为了一些描述。下面的图片是我画的图表,无论它是否正确。

    enterItem sequence diagram

    主要的问题是,我不知道是否应该绘制在终止过程中使用的每个元素、交互和实例。我知道我听起来有点杂乱无章,但请有人帮我解决我的问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   qwerty_so    7 年前

    我没有和你核对代码,看图纸是否正确。只需注意 ProductSpec 直接返回到 POST . 在您的上下文中,这可能是一个合法的缩写,但它可能没有反映代码。

    无论如何,你在SD中的内容应该澄清特定的背景,而不是模糊它。因此,将所有内容放在一个SD中从来都不是一个好主意。而是创建一个粗略的概述来突出主要流程。在POS系统中,首先可能有两件事:初始化全部内容和在目录中输入一篇文章。意味着你要在这里创建两个SDs。您也不应该试图“以图形方式编程”并大量使用片段。将它们留给重要的路径决策等,而不是每个路径决策 if case 您在代码中找到了。就SDs而言,使用更少的SDs通常更好。

    注:我不知道你们老师在这里的用意。这可能与我的陈述相矛盾,他只是想让你创造一个(无用的)墙纸。