사전검증

2026년 4월 1일 09:30분

레위기 22장은 제물의 흠을 사전에 검사합니다. 드리기 전에 반드시 통과해야 할 조건들이 있습니다. 나는 검사 항목을 함수 리스트로 관리하고, 제물을 넣으면 모든 항목을 돌며 실패 목록을 수집합니다. 결함이 없을 때만 수락합니다.

package com.jesusbornd.leviticus;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public class Leviticus_22_Chapter_Lv3 {

    record Offering(String name, boolean hasDefect, boolean isSick, boolean isTooYoung) {}

    static class OfferingValidator {
        private final List<Function<Offering, String>> checks = new ArrayList<>();

        OfferingValidator addCheck(String failMsg, Function<Offering, Boolean> test) {
            checks.add(o -> test.apply(o) ? failMsg : null);
            return this;
        }

        List<String> validate(Offering o) {
            List<String> errors = new ArrayList<>();
            for (Function<Offering, String> check : checks) {
                String result = check.apply(o);
                if (result != null) errors.add(result);
            }
            return errors;
        }

        void accept(Offering o) {
            List<String> errors = validate(o);
            if (errors.isEmpty()) {
                System.out.println(o.name() + " → 수락 / Accepted");
            } else {
                System.out.println(o.name() + " → 거부 / Rejected: " + errors);
            }
        }
    }

    public static void main(String[] args) {
        OfferingValidator validator = new OfferingValidator()
            .addCheck("흠 있음 / Has defect",  Offering::hasDefect)
            .addCheck("병든 것 / Sick",         Offering::isSick)
            .addCheck("너무 어림 / Too young",  Offering::isTooYoung);

        List<Offering> offerings = List.of(
            new Offering("흠 없는 수소",  false, false, false),
            new Offering("흠 있는 양",    true,  false, false),
            new Offering("병든 염소",     false, true,  false),
            new Offering("갓 태어난 새끼", false, false, true)
        );

        offerings.forEach(validator::accept);
    }
}

from dataclasses import dataclass
from typing import Callable

@dataclass
class Offering:
    name: str
    has_defect: bool
    is_sick: bool
    is_too_young: bool


class OfferingValidator:
    def __init__(self):
        self._checks: list[tuple[str, Callable[[Offering], bool]]] = []

    def add_check(self, fail_msg: str, test: Callable[[Offering], bool]) -> "OfferingValidator":
        self._checks.append((fail_msg, test))
        return self

    def validate(self, o: Offering) -> list[str]:
        return [msg for msg, test in self._checks if test(o)]

    def accept(self, o: Offering):
        errors = self.validate(o)
        if not errors:
            print(f"{o.name} → 수락 / Accepted")
        else:
            print(f"{o.name} → 거부 / Rejected: {errors}")


if __name__ == "__main__":
    validator = (
        OfferingValidator()
        .add_check("흠 있음 / Has defect", lambda o: o.has_defect)
        .add_check("병든 것 / Sick",        lambda o: o.is_sick)
        .add_check("너무 어림 / Too young", lambda o: o.is_too_young)
    )

    offerings = [
        Offering("흠 없는 수소",   False, False, False),
        Offering("흠 있는 양",     True,  False, False),
        Offering("병든 염소",      False, True,  False),
        Offering("갓 태어난 새끼", False, False, True),
    ]

    for o in offerings:
        validator.accept(o)

Comments

Avatar
 2026년 4월 1일 20:01분

드리기 전에 모든 조건을 하나씩 통과시키는 구조가, 흠 없는 제물이라는 기준을 코드로 명확하게 보여주네요.



Search

← 목록으로