아래 두 코드 중 “포인트 2배 적립 이벤트” 기능이 추가될 때 변경 범위가 더 좁은 것은 무엇일까요?

interface OrderData {
  orderId: string;
  items: { name: string; price: number; qty: number }[];
  status: string;
}

function calculateTotal(order: OrderData): number {
  return order.items.reduce((sum, item) => sum + item.price * item.qty, 0);
}

function applyDiscount(order: OrderData, rate: number): number {
  return calculateTotal(order) * (1 - rate);
}

function earnPoints(order: OrderData, pointRate: number): number {
  return Math.floor(calculateTotal(order) * pointRate);
}

function earnDoublePoints(order: OrderData, pointRate: number) {
  return Math.floor(calculateTotal(order) * pointRate);
}

function placeOrder(order: OrderData, discountRate: number, pointRate: number, isEvent?:boolean) {
  const finalPrice = applyDiscount(order, discountRate);
  
  const earnedPoints = isEvent ? earnDoublePoints(order, pointRate) :earnPoints(order, pointRate);
  // ...
}
interface PointPolicy {
  earn(order: Order): number;
}

class BasicPointPolicy implements PointPolicy {
  constructor(private readonly rate: number) {}
  
  earn(order: Order): number {
    return Math.floor(order.total().getValue() * this.rate);
  }
}

class DoublePointPolicy implements PointPolicy {
  constructor(private readonly base: BasePointPolicy) {}
  
  earn(order: Order): number {
    return Math.floor(order.total().getValue() * base.rate * 2);
  }
}

class OrderService {
  constructor(
    private readonly discountPolicy: DiscountPolicy,
    private readonly pointPolicy: PointPolicy
  ) {}

  placeOrder(order: Order) {
    const finalPrice = this.discountPolicy.calculate(order);
    const earnedPoints = this.pointPolicy.earn(order);
    // ...
  }
}