欢迎光临散文网 会员登陆 & 注册

作业5(单一职责&开放闭合)

2023-03-19 20:04 作者:酸奶公园  | 我要投稿

作业5(单一职责&开放闭合)

1,简述单一职责原则的优点,并举例说明什么是单一职责原则?

单一职责原则是面向对象设计中的一个重要原则,也被称为SRP原则。它的核心思想是一个模块/类/函数只负责一项职责,即一个模块/类/函数只有一个引起它变化的原因。这样可以使代码更加高内聚、低耦合,易于维护和扩展,并且可以提高代码的可读性和可维护性。

举一个简单的例子:一个计算器类应该只有计算的功能,而不应该包括界面展示的功能。如果将界面展示的功能也加入到计算器类中,那么当界面展示需要变化时,就不得不修改计算器类的代码,违反了单一职责原则。

另一个例子是一个日志类,它只应该负责记录日志,而不应该同时负责发送邮件或者短信通知。如果将发送邮件或短信的功能也加入到日志类中,那么当发送方式需要变化时,就不得不修改日志类的代码,也违反了单一职责原则。

总之,单一职责原则是面向对象设计中的一个重要原则,它可以使代码更加高内聚、低耦合、易于维护和扩展,并且可以提高代码的可读性和可维护性。

2,Sunny软件公司开发的CRM系统可以显示各种类型的图表,如饼状图、柱状图等。该系统持续改进,用户希望能够支持更多类的图表显示方式,例如增加LineChart,利用开放闭合原则优化如下类的设计。

可以采取以下设计方案:

1. 定义一个抽象的图表类 Chart,其中包含一个抽象的 display() 方法用于显示图表。

2. Chart 类的子类分别表示不同类型的图表,例如 PieChart、BarChart、LineChart 等,它们实现了父类 Chart 的 display() 方法。

3. 如果要增加新类型的图表,只需要定义一个新的子类,并实现 display() 方法即可,不需要修改现有的代码。

这样,当用户需要新的图表类型时,只需增加相应的子类,而不是修改已有的代码,符合开放-封闭原则,也提高了系统的可维护性和扩展性。


3,简述开放闭合原则的核心,并举例说明如何使用开放闭合原则优化类的设计。

开放闭合原则是面向对象设计中重要的设计原则之一,其核心思想是对扩展开放,对修改关闭。这意味着一个类的设计应该可以方便地扩展功能,而不需要修改原有的代码。

一个常见的例子就是计算器程序。假设我们有一个计算器程序,其中包含加减乘除四个操作。现在,我们需要新增一个求平方的操作。如果我们不遵循开放闭合原则,很可能需要修改原有代码,甚至在每个操作中都要添加一个平方操作。这会导致代码维护的困难,也会增加出错的风险。

优化类的设计可以遵循开放闭合原则,可以采用策略模式或者工厂模式来实现。我们可以为每个操作定义一个接口,然后通过实现类来具体实现每个操作。这样,当我们需要新增一个操作时,只需要实现新的操作接口即可,不需要修改原有代码。同时,也可以通过工厂模式来动态实例化具体的操作类,进一步实现开放闭合原则。这样做的好处是,当我们需要添加新的操作时,只需要新增操作类并实现操作接口即可,不需要修改原有的代码。

4,某基于Java的C/S系统的登录功能通过如下类实现,请分析类的组成,并利用单一职责原则对其重构



由于没有给出具体的登录功能实现代码,无法直接分析类的组成。但是,根据常规的C/S系统设计,登录功能通常涉及到前端界面(如登录界面)和服务器端的处理(如验证用户账号密码),因此可以初步将其分为两部分:前端和后端。

前端部分可以抽象出一个LoginView类,主要包含登录界面的UI设计和用户输入的信息获取。该类负责展示并获取用户输入的信息,但不应该处理输入信息的验证和登录操作。

后端部分可以抽象出一个LoginService类,负责处理用户登录请求。该类应该包括对用户输入信息的验证和登录状态的确认,并将登录状态返回给前端。但不应该涉及UI界面和用户输入信息的处理。

根据单一职责原则,一个类应该只有一个职责,不能承担过多的职责。因此,建议将前端的UI设计和用户输入信息的获取分离出来,由LoginView类负责;将用户登录请求的处理分离出来,由LoginService类负责。这样可以提高代码的可维护性和可读性,同时也有利于代码的单元测试。


5,利用Java代码实现单一职责原则课堂Book案例。



public class Book {
   private String name;
   private String author;
   private String publisher;
   private int pageCount;
   private double price;

   public Book(String name, String author, String publisher, int pageCount, double price) {
       this.name = name;
       this.author = author;
       this.publisher = publisher;
       this.pageCount = pageCount;
       this.price = price;
   }

   public String getName() {
       return name;
   }

   public String getAuthor() {
       return author;
   }

   public String getPublisher() {
       return publisher;
   }

   public int getPageCount() {
       return pageCount;
   }

   public double getPrice() {
       return price;
   }
}

public interface BookPersistence {
   void save(Book book, String filename);
}

public class FileBookPersistence implements BookPersistence {
   @Override
   public void save(Book book, String filename) {
       // 将Book对象保存在文件中
   }
}

public class DatabaseBookPersistence implements BookPersistence {
   @Override
   public void save(Book book, String filename) {
       // 将Book对象保存在数据库中
   }
}

public interface BookPrinter {
   void print(Book book);
}

public class ConsoleBookPrinter implements BookPrinter {
   @Override
   public void print(Book book) {
       // 在控制台上打印Book对象的信息
   }
}

public class WebBookPrinter implements BookPrinter {
   @Override
   public void print(Book book) {
       // 在web页面上打印Book对象的信息
   }
}

在上述代码中,Book类表示一本书,它只包含一本书的基本信息,例如书名、作者、出版商、页数和价格。这遵循了单一职责原则,即每个类应该只有一个职责。BookPersistence和BookPrinter接口分别表示将书籍信息保存到不同介质,以及将书籍信息打印到不同设备上。FileBookPersistence和DatabaseBookPersistence类分别表示将书籍信息保存到文件和数据库中。ConsoleBookPrinter和WebBookPrinter类分别表示将Book对象打印到控制台和Web页面上。这些类的分离允许它们

作业5(单一职责&开放闭合)的评论 (共 条)

分享到微博请遵守国家法律