MST

星途 面试题库

面试题:JavaScript中class关键字定义类在复杂业务场景下的设计与应用

在一个电商系统中,有商品类`Product`,包含`id`、`name`、`price`等基本属性以及`getDetails`方法用于获取商品详情。同时有`DigitalProduct`类继承自`Product`,它额外有`downloadLink`属性和`download`方法;`PhysicalProduct`类也继承自`Product`,它有`weight`属性和`calculateShipping`方法。请设计这几个类的结构,考虑到代码的可维护性、扩展性以及在不同模块间的交互,同时说明如何处理可能出现的类之间的依赖关系以及数据一致性问题。
46.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

类的设计

  1. Product:作为基类,包含商品通用属性和方法。
public class Product {
    private int id;
    private String name;
    private double price;

    public Product(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public String getDetails() {
        return "ID: " + id + ", Name: " + name + ", Price: " + price;
    }
}
  1. DigitalProduct:继承自Product,添加downloadLink属性和download方法。
public class DigitalProduct extends Product {
    private String downloadLink;

    public DigitalProduct(int id, String name, double price, String downloadLink) {
        super(id, name, price);
        this.downloadLink = downloadLink;
    }

    public String getDownloadLink() {
        return downloadLink;
    }

    public void download() {
        System.out.println("Downloading product from: " + downloadLink);
    }
}
  1. PhysicalProduct:继承自Product,添加weight属性和calculateShipping方法。
public class PhysicalProduct extends Product {
    private double weight;

    public PhysicalProduct(int id, String name, double price, double weight) {
        super(id, name, price);
        this.weight = weight;
    }

    public double getWeight() {
        return weight;
    }

    public double calculateShipping() {
        // 简单示例,实际根据业务计算
        return weight * 0.1; 
    }
}

处理类之间的依赖关系

  1. 依赖倒置原则:尽量依赖抽象(如接口或抽象类)而不是具体实现。例如,如果有模块需要处理商品,可定义一个接口ProductService,不同商品类型实现该接口,这样模块依赖接口而非具体的DigitalProductPhysicalProduct类。
public interface ProductService {
    String getProductInfo();
}

public class DigitalProductService implements ProductService {
    private DigitalProduct digitalProduct;

    public DigitalProductService(DigitalProduct digitalProduct) {
        this.digitalProduct = digitalProduct;
    }

    @Override
    public String getProductInfo() {
        return digitalProduct.getDetails() + ", Download Link: " + digitalProduct.getDownloadLink();
    }
}

public class PhysicalProductService implements ProductService {
    private PhysicalProduct physicalProduct;

    public PhysicalProductService(PhysicalProduct physicalProduct) {
        this.physicalProduct = physicalProduct;
    }

    @Override
    public String getProductInfo() {
        return physicalProduct.getDetails() + ", Weight: " + physicalProduct.getWeight() + ", Shipping Cost: " + physicalProduct.calculateShipping();
    }
}
  1. 控制反转(IoC)/依赖注入(DI):使用框架(如Spring)来管理对象的创建和依赖关系。这样可以通过配置文件或注解来注入依赖,而不是在类内部直接创建对象,提高可测试性和可维护性。

数据一致性问题

  1. 数据库事务:如果商品信息存储在数据库中,使用数据库事务来确保数据一致性。例如,在更新商品价格时,如果涉及到多个相关表(如库存表等)的修改,将这些操作放在一个事务中,要么全部成功,要么全部回滚。
  2. 数据验证:在设置商品属性时进行严格的数据验证。比如,价格不能为负数,重量必须为正数等。在构造函数或Setter方法中添加验证逻辑。
public class Product {
    //...
    public void setPrice(double price) {
        if (price < 0) {
            throw new IllegalArgumentException("Price cannot be negative");
        }
        this.price = price;
    }
    //...
}
  1. 版本控制:对于商品信息的修改,可以使用版本控制机制。每次修改商品信息时,版本号递增。在读取数据时,可以根据版本号来判断数据是否是最新的,避免脏读等问题。