Single Responsibility Principle ( in SOLID )

Kim Dong Kyun·2022년 11월 28일
0

Today I learned

목록 보기
11/43

Robert C Martin,

A class should have one, and only one reason to change. - Robert C Martin,
클래스는 단 하나의 책임만 가져야 하고, 하나의 책임의 기준은 변경이다. 변경의 비용이 적어야 한다.

우리가 Class를 설계할 때, 우리의 클래스가 단 하나의 task나 기능을 책임져야 하고, 만약 task나 기능을 변경해야 할 때만 class를 변경해야 한다.

SRP의 장점

  • 하나의 기능이 여러개 클래스를 가질 때, 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();
	}
}
  • PSVM을 이용한 값 설정 파트.
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;
	}
}
  • Customer class : 고객은 이름, 주소를 가지고 있다. get/set method를 통해 이를 다른 매서드에 반환해 줄 수 있다.
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. Customer, orderId, itemName, quantity, totalBillAmount로 구성된다. 주문에 필요한 필수 요소들만 존재한다.
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());
	}
}
  • calculateBill 매서드가 포함된 클래스이다. 위쪽 클래스에서 선언한 변수들을 사용해서 TotalBillAmt를 계산한다.
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/

0개의 댓글