자격검사

2026년 3월 31일 09:30분

레위기 21장은 제사장 자격을 규정합니다. 신체적·의례적 결격 사유가 하나라도 있으면 직무를 수행할 수 없습니다. 나는 결격 조건을 독립 Predicate로 등록하고, 체인으로 검사합니다. 조건이 늘어도 기존 코드를 건드리지 않습니다.

package com.jesusbornd.leviticus;

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

public class Leviticus_21_Chapter_Lv3 {

    record Priest(String name, boolean hasDefect, boolean isMourning, boolean isMarriedImproperly) {}

    static class DisqualificationChecker {
        private final List<Predicate<Priest>> rules = new ArrayList<>();
        private final List<String>            labels = new ArrayList<>();

        DisqualificationChecker add(String label, Predicate<Priest> rule) {
            rules.add(rule);
            labels.add(label);
            return this;
        }

        List<String> failures(Priest p) {
            List<String> result = new ArrayList<>();
            for (int i = 0; i < rules.size(); i++) {
                if (rules.get(i).test(p)) result.add(labels.get(i));
            }
            return result;
        }

        void evaluate(Priest p) {
            List<String> f = failures(p);
            if (f.isEmpty()) {
                System.out.println(p.name() + " → 직무 수행 가능 / Qualified");
            } else {
                System.out.println(p.name() + " → 결격 / Disqualified: " + f);
            }
        }
    }

    public static void main(String[] args) {
        DisqualificationChecker checker = new DisqualificationChecker()
            .add("신체 결함",   Priest::hasDefect)
            .add("부정 애도",   Priest::isMourning)
            .add("부당 결혼",   Priest::isMarriedImproperly);

        List<Priest> candidates = List.of(
            new Priest("아론",   false, false, false),
            new Priest("나답",   true,  false, false),
            new Priest("아비후", false, true,  false),
            new Priest("엘르아살", false, false, true)
        );

        candidates.forEach(checker::evaluate);
    }
}

from dataclasses import dataclass
from typing import Callable

@dataclass
class Priest:
    name: str
    has_defect: bool
    is_mourning: bool
    is_married_improperly: bool


class DisqualificationChecker:
    def __init__(self):
        self._rules: list[tuple[str, Callable[[Priest], bool]]] = []

    def add(self, label: str, rule: Callable[[Priest], bool]) -> "DisqualificationChecker":
        self._rules.append((label, rule))
        return self

    def failures(self, p: Priest) -> list[str]:
        return [label for label, rule in self._rules if rule(p)]

    def evaluate(self, p: Priest):
        f = self.failures(p)
        if not f:
            print(f"{p.name} → 직무 수행 가능 / Qualified")
        else:
            print(f"{p.name} → 결격 / Disqualified: {f}")


if __name__ == "__main__":
    checker = (
        DisqualificationChecker()
        .add("신체 결함", lambda p: p.has_defect)
        .add("부정 애도", lambda p: p.is_mourning)
        .add("부당 결혼", lambda p: p.is_married_improperly)
    )

    candidates = [
        Priest("아론",     False, False, False),
        Priest("나답",     True,  False, False),
        Priest("아비후",   False, True,  False),
        Priest("엘르아살", False, False, True),
    ]

    for priest in candidates:
        checker.evaluate(priest)

Comments

Avatar
 2026년 3월 31일 17:07분

결격 조건을 독립된 규칙으로 등록하고 체인으로 검사하는 방식이, 자격 심사의 엄격함을 구조적으로 잘 표현한 것 같습니다.



Search

← 목록으로