Namaran

Code daily. Without assist.

2026-09-21

username.cpp

#include <optional>
#include <string>
#include <utility>

class Username {
public:
    static std::optional<Username> create(std::string name) {
        // write this: return std::nullopt if name is empty or longer than
        // 16 characters; otherwise return a Username holding it.
    }
    const std::string &value() const { return name_; }
private:
    explicit Username(std::string name) : name_(std::move(name)) {}
    std::string name_;
};

Username::createを実装してください。コンストラクタはprivateなので、不変条件(空でなく16文字以下)を満たさないUsernameはここでしか作れません。

Reference
static std::optional<Username> create(std::string name) {
    if (name.empty() || name.size() > 16) {
        return std::nullopt;
    }
    return Username(std::move(name));
}

コンストラクタがprivateなので、Usernameを手に入れる唯一の経路はこのcreateだけです。つまり不変条件のチェックを1箇所に集約でき、いったんUsernameを手にした後のコードは「この値は必ず空でなく16文字以下である」ことを、そのたびに確認し直さずに前提にできます。Percentageの例(READ参照)のようにコンストラクタで例外を投げる代わりに、std::optionalで失敗を表すことで、呼び出し側は例外処理を書かずにifで結果を確認できます。これは参考実装であり、唯一の正解ではありません。