A class should have one, and only one reason to change. - Robert C Martin,
클래스는 단 하나의 책임만 가져야 하고, 하나의 책임의 기준은 변경이다. 변경의 비용이 적어야 한다.
우리가 Class를 설계할 때, 우리의 클래스가 단 하나의 task나 기능을 책임져야 하고, 만약 task나 기능을 변경해야 할 때만 class를 변경해야 한다.
하나의 기능이 여러개 클래스를 가질 때, SRP 원칙을 따름으로써 이 기능은 좀 더 유지보수가 편해지고, 이해하기 쉬워진다.
어플리케이션의 코드 퀄리티가 더 좋고, 따라서 더 적은 결함을 가진다.
프로젝트에 새로운 멤버를 참여시키기 쉽고, 따라서 새로운 참여자는 더 많은 기여를 하게 된다.
case들을 테스트하고 writing 하기가 간단해진다.
아래는 코드 예시이다.
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
Customer customer1 = new Customer();
customer1.setName("John");
customer1.setAddress("Pune");
Order order1 = new Order();
order1.setItemName("Pizza");
order1.setQuantity(2);
order1.setCustomer(customer1);
order1.prepareOrder();
BillCalculation billCalculation
= new BillCalculation(order1);
billCalculation.calculateBill();
DeliveryApp deliveryApp = new DeliveryApp(order1);
deliveryApp.delivery();
}
}
class Customer {
private String name;
private String address;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getAddress() { return address; }
public void setAddress(String address)
{
this.address = address;
}
}
class Order {
private Customer customer;
private String orderId;
private String itemName;
private int quantity;
private int totalBillAmt;
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer)
{
this.customer = customer;
}
public String getOrderId() { return orderId; }
public void setOrderId(String orderId)
{
Random random = new Random();
this.orderId = orderId + "-" + random.nextInt(500);
}
public String getItemName() { return itemName; }
public void setItemName(String itemName)
{
this.itemName = itemName;
setOrderId(itemName);
}
public int getQuantity() { return quantity; }
public void setQuantity(int quantity)
{
this.quantity = quantity;
}
public int getTotalBillAmt() { return totalBillAmt; }
public void setTotalBillAmt(int totalBillAmt)
{
this.totalBillAmt = totalBillAmt;
}
public void prepareOrder()
{
System.out.println("Preparing order for customer -"
+ this.getCustomer().getName()
+ " who has ordered "
+ this.getItemName());
}
}
class BillCalculation {
private Order order;
public BillCalculation(Order order)
{
this.order = order;
}
public void calculateBill()
{
/* In the real world, we would want a kind of lookup
functionality implemented here where we look for
the price of each item included in the order, add
them up and add taxes, delivery charges, etc on
top to reach the total price. We will simulate
this behaviour here, by generating a random number
for total price.
*/
Random rand = new Random();
int totalAmt
= rand.nextInt(200) * this.order.getQuantity();
this.order.setTotalBillAmt(totalAmt);
System.out.println("Order with order id "
+ this.order.getOrderId()
+ " has a total bill amount of "
+ this.order.getTotalBillAmt());
}
}
class DeliveryApp {
private Order order;
public DeliveryApp(Order order) { this.order = order; }
public void delivery()
{
// Here, we would want to interface with another
// system which actually assigns the task of
// delivery to different persons
// based on location, etc.
System.out.println("Delivering the order");
System.out.println(
"Order with order id as "
+ this.order.getOrderId()
+ " being delivered to "
+ this.order.getCustomer().getName());
System.out.println(
"Order is to be delivered to: "
+ this.order.getCustomer().getAddress());
}
}
위와 같이 class들은 하나의 책임이 있어야 한다.
동료들이 코드를 보다 쉽게 이해하고! 사용 상황에서 편의성을 극대화하기 위해서!(변경 비용 감소).
https://www.geeksforgeeks.org/single-responsibility-principle-in-java-with-examples/