人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e
5番目の本のプログラマ編。
6. 小公女
新潮文庫, 1953/12, Frances Hodgson Burnett
http://www.gutenberg.org/ebooks/146
html(gutenberg)
http://www.gutenberg.org/files/146/146-h/146-h.htm
https://www.amazon.co.jp/dp/product/4102214011/
https://bookmeter.com/books/567901
https://booklog.jp/item/1/4102214038
父を亡くして孤児になった少女が、生徒だった学園で働きながら暮らしていく様を表現。 手のひらを返すという用語が、ぴったりの学園の対応。 逆境にもめげない主人公。 最後は、父の知人からの遺産の授与で幸せになる物語。 ps. 川端靖成が翻訳にかかわっていることを、角川書店版で知りました。
ChatGPT
小公女 Frances Hodgson Burnett らプログラマが学ぶとよい視点を7つご紹介ください。
ChatGPT:
もちろんです!『小公女』をプログラマ視点で読み解くと、物語のテーマやキャラクターの行動からソフトウェア開発やプログラム設計に活かせる教訓や視点を引き出すことができます。以下に7つの視点をご紹介します。
- 柔軟性と適応力(Adaptability)
物語の示唆: サラは環境が大きく変わっても、自分の価値観と行動を保ちながら適応します。
プログラマへの学び: 仕様変更や環境の変化にも柔軟に対応できる設計を心がける。例:プラグイン可能なアーキテクチャ、設定ファイルによるカスタマイズ。 - データ構造の価値(Data Representation)
物語の示唆: サラは物や人の価値を見抜く目を持ち、状況を整理して理解します。
プログラマへの学び: データ構造やクラス設計は「物の価値や関係性」を正確に表現することが大切。適切な抽象化を行うこと。 - エラー耐性(Resilience)
物語の示唆: サラは困難や不正に遭遇しても折れず、立ち直る力があります。
プログラマへの学び: バグや例外処理に耐えられる堅牢なコードを書く。例:try-catch、入力検証、冗長性の確保。 - オブジェクト指向的思考(Object-Oriented Thinking)
物語の示唆: サラは人や物を一つひとつ尊重し、関係性を理解して行動します。
プログラマへの学び: オブジェクト指向設計では「オブジェクトの属性と振る舞いを尊重する」ことが重要。継承・ポリモーフィズムの設計に応用できる。 - 再利用性(Reusability)
物語の示唆: サラは持ち物や知識をうまく活用して困難を乗り越えます。
プログラマへの学び: コードやモジュールは再利用しやすく設計すること。例:関数化、ライブラリ化、汎用クラスの設計。 - ユーザー視点(Empathy for Users)
物語の示唆: サラは他者の気持ちを理解して行動します。
プログラマへの学び: ソフトウェア開発ではユーザー体験を意識することが重要。UX設計やユーザーフレンドリーなエラー表示などに反映可能。 - モジュール分割(Separation of Concerns)
物語の示唆: サラは感情、行動、知識を整理して状況に応じた対応をします。
プログラマへの学び: 機能ごとにコードを分離し、依存を減らす設計を心がける。例:MVCアーキテクチャ、クリーンアーキテクチャ。
もしご希望であれば、この7つの視点を具体的なプログラム設計例やC++ / Rustコード例に変換して示すこともできます。
作ってほしいですか?
はい。
ChatGPT:
了解です!では、先ほどの『小公女』から学ぶ7つのプログラマ視点を、C++ と Rust の簡単なプログラム設計例で示します。物語のテーマをコードに落とし込む形です。
- 柔軟性と適応力(Adaptability)
C++
#include
#include
class Environment {
public:
virtual void describe() = 0;
};
class School : public Environment {
public:
void describe() override { std::cout << "学校環境: 厳しいけど学び多し\n"; }
};
class Mansion : public Environment {
public:
void describe() override { std::cout << "屋敷環境: 贅沢だけど孤独\n"; }
};
class Sara {
public:
void adapt(Environment* env) { env->describe(); }
};
int main() {
Sara sara;
School school;
Mansion mansion;
sara.adapt(&school);
sara.adapt(&mansion);
}
Rust
trait Environment {
fn describe(&self);
}
struct School;
struct Mansion;
impl Environment for School {
fn describe(&self) { println!("学校環境: 厳しいけど学び多し"); }
}
impl Environment for Mansion {
fn describe(&self) { println!("屋敷環境: 贅沢だけど孤独"); }
}
struct Sara;
impl Sara {
fn adapt(&self, env: &dyn Environment) { env.describe(); }
}
fn main() {
let sara = Sara;
let school = School;
let mansion = Mansion;
sara.adapt(&school);
sara.adapt(&mansion);
}
2. データ構造の価値(Data Representation)
C++
#include
#include
struct Item {
std::string name;
int value;
};
int main() {
std::vector belongings = { {"人形", 100}, {"本", 200} };
for(auto& item : belongings)
std::cout << item.name << " の価値: " << item.value << "\n";
}
Rust
struct Item {
name: String,
value: u32,
}
fn main() {
let belongings = vec![
Item { name: "人形".to_string(), value: 100 },
Item { name: "本".to_string(), value: 200 },
];
for item in belongings {
println!("{} の価値: {}", item.name, item.value);
}
}
3. エラー耐性(Resilience)
C++
#include
#include
int main() {
try {
throw std::runtime_error("困難が発生!");
} catch(const std::exception& e) {
std::cout << "サラは立ち直った: " << e.what() << "\n";
}
}
Rust
fn main() {
let result: Result<(), &str> = Err("困難が発生!");
match result {
Ok(_) => println!("順調"),
Err(e) => println!("サラは立ち直った: {}", e),
}
}
4. オブジェクト指向的思考(Object-Oriented Thinking)
C++
#include
class Person {
public:
std::string name;
Person(const std::string& n) : name(n) {}
virtual void greet() { std::cout << "こんにちは、" << name << "です\n"; }
};
class Friend : public Person {
public:
Friend(const std::string& n) : Person(n) {}
void greet() override { std::cout << name << "と友達になった!\n"; }
};
int main() {
Person sara("サラ");
Friend becky("ベッキー");
sara.greet();
becky.greet();
}
Rust
trait Greet {
fn greet(&self);
}
struct Person { name: String }
struct Friend { name: String }
impl Greet for Person {
fn greet(&self) { println!("こんにちは、{}です", self.name); }
}
impl Greet for Friend {
fn greet(&self) { println!("{}と友達になった!", self.name); }
}
fn main() {
let sara = Person { name: "サラ".to_string() };
let becky = Friend { name: "ベッキー".to_string() };
sara.greet();
becky.greet();
}
5. 再利用性(Reusability)
C++
#include
void helpFriend(const std::string& name) {
std::cout << name << "を助けた!\n";
}
int main() {
helpFriend("ベッキー");
helpFriend("ルーシー");
}
Rust
fn help_friend(name: &str) {
println!("{}を助けた!", name);
}
fn main() {
help_friend("ベッキー");
help_friend("ルーシー");
}
6. ユーザー視点(Empathy for Users)
C++
#include
#include
void greetUser(const std::string& userName) {
std::cout << "こんにちは、" << userName << "さん!どうしたいですか?\n";
}
int main() {
greetUser("サラ");
}
Rust
fn greet_user(user_name: &str) {
println!("こんにちは、{}さん!どうしたいですか?", user_name);
}
fn main() {
greet_user("サラ");
}
7. モジュール分割(Separation of Concerns)
C++
#include
class InputHandler {
public:
void getInput() { std::cout << "入力を取得\n"; }
};
class OutputHandler {
public:
void showOutput() { std::cout << "結果を表示\n"; }
};
int main() {
InputHandler input;
OutputHandler output;
input.getInput();
output.showOutput();
}
Rust
struct InputHandler;
struct OutputHandler;
impl InputHandler {
fn get_input(&self) { println!("入力を取得"); }
}
impl OutputHandler {
fn show_output(&self) { println!("結果を表示"); }
}
fn main() {
let input = InputHandler;
let output = OutputHandler;
input.get_input();
output.show_output();
}
💡 こうして見ると、サラの行動や性格をプログラミングの設計原則に置き換えられることがわかります。
希望であれば、次のステップとして 「小公女の物語をもとにした小さなオブジェクト指向アプリ」 まで作って、サラの行動をシミュレーションすることもできます。
作りますか?
はい。
ChatGPT:
了解です!では『小公女』の世界を簡単にシミュレーションする オブジェクト指向アプリ を設計します。サラや周囲のキャラクターをクラス化し、行動・環境・アイテムを管理できるようにします。
ここでは C++版 と Rust版 を示します。
C++版:小公女シミュレーション
#include
#include
#include
class Item {
public:
std::string name;
int value;
Item(const std::string& n, int v) : name(n), value(v) {}
void show() { std::cout << name << " (価値: " << value << ")\n"; }
};
class Environment {
public:
std::string name;
Environment(const std::string& n) : name(n) {}
void describe() { std::cout << "環境: " << name << "\n"; }
};
class Character {
public:
std::string name;
std::vector belongings;
Character(const std::string& n) : name(n) {}
void addItem(const Item& item) { belongings.push_back(item); }
void showBelongings() {
std::cout << name << "の持ち物:\n";
for (auto& item : belongings) item.show();
}
void interact(Character& other) {
std::cout << name << "は" << other.name << "と交流した。\n";
}
void adapt(Environment& env) {
std::cout << name << "は" << env.name << "に適応した。\n";
}
};
int main() {
// 環境
Environment school("学校");
Environment mansion("屋敷");
// キャラクター
Character sara("サラ");
Character becky("ベッキー");
// アイテム
sara.addItem(Item("人形", 100));
sara.addItem(Item("本", 200));
// シミュレーション
sara.adapt(school);
sara.interact(becky);
sara.showBelongings();
sara.adapt(mansion);
}
ポイント
Character クラスはサラや他キャラクターを表現
Item クラスは持ち物を抽象化
Environment クラスは環境を表現
メソッドで 行動(adapt, interact, showBelongings) を表現
Rust版:小公女シミュレーション
struct Item {
name: String,
value: u32,
}
impl Item {
fn show(&self) {
println!("{} (価値: {})", self.name, self.value);
}
}
struct Environment {
name: String,
}
impl Environment {
fn describe(&self) {
println!("環境: {}", self.name);
}
}
struct Character {
name: String,
belongings: Vec,
}
impl Character {
fn new(name: &str) -> Self {
Self { name: name.to_string(), belongings: vec![] }
}
fn add_item(&mut self, item: Item) {
self.belongings.push(item);
}
fn show_belongings(&self) {
println!("{}の持ち物:", self.name);
for item in &self.belongings {
item.show();
}
}
fn interact(&self, other: &Character) {
println!("{}は{}と交流した。", self.name, other.name);
}
fn adapt(&self, env: &Environment) {
println!("{}は{}に適応した。", self.name, env.name);
}
}
fn main() {
// 環境
let school = Environment { name: "学校".to_string() };
let mansion = Environment { name: "屋敷".to_string() };
// キャラクター
let mut sara = Character::new("サラ");
let becky = Character::new("ベッキー");
// アイテム
sara.add_item(Item { name: "人形".to_string(), value: 100 });
sara.add_item(Item { name: "本".to_string(), value: 200 });
// シミュレーション
sara.adapt(&school);
sara.interact(&becky);
sara.show_belongings();
sara.adapt(&mansion);
}
💡 拡張アイデア
行動パターン(困難に立ち向かう、助ける、感情表現)をメソッドに追加
環境によるステータス変化(幸福度、疲労度など)を実装
他キャラクターとの関係性を friendship や trust の数値で表現
シナリオを作り、イベント駆動型にすると小さなゲームとしても動く
もし希望であれば、次のステップとして 「サラの行動シミュレーションをゲーム化して、困難や友情のポイントを管理する簡易システム」 を作ることもできます。
作りますか?
はい。
ChatGPT:
完璧です!では次のステップとして、サラの行動をシミュレーションする簡易ゲームシステムを作ります。
このシステムの特徴は以下の通りです:
サラは環境(学校・屋敷)に適応する
行動(助ける、学ぶ、遊ぶ)によって 幸福度 や 友情度 が変化
イベントによって予期せぬ困難が発生し、エラー耐性が試される
最終的に幸福度や友情度を評価
C++版:小公女シミュレーションゲーム
#include
#include
#include
#include
#include
class Character {
public:
std::string name;
int happiness = 50; // 幸福度 0-100
int friendship = 50; // 友情度 0-100
Character(const std::string& n) : name(n) {}
void show_status() {
std::cout << name << "のステータス: 幸福度=" << happiness
<< ", 友情度=" << friendship << "\n";
}
void adapt_environment(const std::string& env) {
std::cout << name << "は" << env << "に適応した。\n";
happiness += 5;
if(happiness > 100) happiness = 100;
}
void help_friend(Character& friend_char) {
std::cout << name << "は" << friend_char.name << "を助けた!\n";
friendship += 10;
if(friendship > 100) friendship = 100;
happiness += 5;
if(happiness > 100) happiness = 100;
}
void face_challenge() {
std::cout << name << "は困難に直面した!\n";
int chance = rand() % 2;
if(chance == 0) {
std::cout << "うまく乗り越えた!\n";
happiness += 10;
} else {
std::cout << "少し落ち込んだ...\n";
happiness -= 10;
if(happiness < 0) happiness = 0;
}
}
};
int main() {
srand(time(0));
Character sara("サラ");
Character becky("ベッキー");
sara.show_status();
sara.adapt_environment("学校");
sara.help_friend(becky);
sara.face_challenge();
sara.adapt_environment("屋敷");
sara.face_challenge();
sara.show_status();
}
Rust版:小公女シミュレーションゲーム
use rand::Rng;
struct Character {
name: String,
happiness: i32,
friendship: i32,
}
impl Character {
fn new(name: &str) -> Self {
Self { name: name.to_string(), happiness: 50, friendship: 50 }
}
fn show_status(&self) {
println!("{}のステータス: 幸福度={}, 友情度={}", self.name, self.happiness, self.friendship);
}
fn adapt_environment(&mut self, env: &str) {
println!("{}は{}に適応した。", self.name, env);
self.happiness += 5;
if self.happiness > 100 { self.happiness = 100; }
}
fn help_friend(&mut self, friend: &mut Character) {
println!("{}は{}を助けた!", self.name, friend.name);
self.friendship += 10;
if self.friendship > 100 { self.friendship = 100; }
self.happiness += 5;
if self.happiness > 100 { self.happiness = 100; }
}
fn face_challenge(&mut self) {
println!("{}は困難に直面した!", self.name);
let mut rng = rand::thread_rng();
if rng.gen_bool(0.5) {
println!("うまく乗り越えた!");
self.happiness += 10;
} else {
println!("少し落ち込んだ...");
self.happiness -= 10;
if self.happiness < 0 { self.happiness = 0; }
}
}
}
fn main() {
let mut sara = Character::new("サラ");
let mut becky = Character::new("ベッキー");
sara.show_status();
sara.adapt_environment("学校");
sara.help_friend(&mut becky);
sara.face_challenge();
sara.adapt_environment("屋敷");
sara.face_challenge();
sara.show_status();
}
💡 拡張アイデア
イベントリストを作る
「嵐で屋敷が壊れる」「友達が悲しむ」などランダムイベントを追加
行動選択をプレイヤー入力にする
「助ける」「遊ぶ」「学ぶ」など選択肢で分岐
ステータスに影響するアイテム追加
本、花、人形など持ち物で幸福度や友情度を変化
複数キャラクター管理
友情度の相互作用でキャラクター同士の関係性をシミュレーション
希望であれば、このシステムを 入力選択型の簡単なゲームに拡張して、サラの行動をユーザーが選択できる形に作ることもできます。
作りますか?
あなた:
はい。
ChatGPT:
了解です!では、先ほどの小公女シミュレーションを ユーザーが行動を選択できる入力選択型の簡単なゲーム に拡張します。
C++版:小公女アドベンチャー(選択型)
#include
#include
#include
#include
class Character {
public:
std::string name;
int happiness = 50; // 幸福度 0-100
int friendship = 50; // 友情度 0-100
Character(const std::string& n) : name(n) {}
void show_status() {
std::cout << name << "のステータス: 幸福度=" << happiness
<< ", 友情度=" << friendship << "\n";
}
void adapt_environment(const std::string& env) {
std::cout << name << "は" << env << "に適応した。\n";
happiness += 5;
if(happiness > 100) happiness = 100;
}
void help_friend(Character& friend_char) {
std::cout << name << "は" << friend_char.name << "を助けた!\n";
friendship += 10;
if(friendship > 100) friendship = 100;
happiness += 5;
if(happiness > 100) happiness = 100;
}
void play() {
std::cout << name << "は遊んで楽しい時間を過ごした!\n";
happiness += 10;
if(happiness > 100) happiness = 100;
}
void face_challenge() {
std::cout << name << "は困難に直面した!\n";
int chance = rand() % 2;
if(chance == 0) {
std::cout << "うまく乗り越えた!\n";
happiness += 10;
} else {
std::cout << "少し落ち込んだ...\n";
happiness -= 10;
if(happiness < 0) happiness = 0;
}
}
};
int main() {
srand(time(0));
Character sara("サラ");
Character becky("ベッキー");
sara.show_status();
std::string environment = "学校";
sara.adapt_environment(environment);
// 選択型ゲーム
for(int turn = 1; turn <= 3; ++turn) {
std::cout << "\n行動を選んでください:\n";
std::cout << "1. ベッキーを助ける\n";
std::cout << "2. 遊ぶ\n";
std::cout << "3. 困難に立ち向かう\n";
std::cout << "選択 (1-3): ";
int choice;
std::cin >> choice;
switch(choice) {
case 1: sara.help_friend(becky); break;
case 2: sara.play(); break;
case 3: sara.face_challenge(); break;
default: std::cout << "無効な選択です。\n"; break;
}
sara.show_status();
}
environment = "屋敷";
sara.adapt_environment(environment);
std::cout << "\nゲーム終了!最終ステータス:\n";
sara.show_status();
}
Rust版:小公女アドベンチャー(選択型)
use rand::Rng;
use std::io;
struct Character {
name: String,
happiness: i32,
friendship: i32,
}
impl Character {
fn new(name: &str) -> Self {
Self { name: name.to_string(), happiness: 50, friendship: 50 }
}
fn show_status(&self) {
println!("{}のステータス: 幸福度={}, 友情度={}", self.name, self.happiness, self.friendship);
}
fn adapt_environment(&mut self, env: &str) {
println!("{}は{}に適応した。", self.name, env);
self.happiness += 5;
if self.happiness > 100 { self.happiness = 100; }
}
fn help_friend(&mut self, friend: &mut Character) {
println!("{}は{}を助けた!", self.name, friend.name);
self.friendship += 10;
if self.friendship > 100 { self.friendship = 100; }
self.happiness += 5;
if self.happiness > 100 { self.happiness = 100; }
}
fn play(&mut self) {
println!("{}は遊んで楽しい時間を過ごした!", self.name);
self.happiness += 10;
if self.happiness > 100 { self.happiness = 100; }
}
fn face_challenge(&mut self) {
println!("{}は困難に直面した!", self.name);
let mut rng = rand::thread_rng();
if rng.gen_bool(0.5) {
println!("うまく乗り越えた!");
self.happiness += 10;
} else {
println!("少し落ち込んだ...");
self.happiness -= 10;
if self.happiness < 0 { self.happiness = 0; }
}
}
}
fn main() {
let mut sara = Character::new("サラ");
let mut becky = Character::new("ベッキー");
sara.show_status();
let mut environment = "学校";
sara.adapt_environment(environment);
// 選択型ゲーム
for turn in 1..=3 {
println!("\n行動を選んでください:");
println!("1. ベッキーを助ける");
println!("2. 遊ぶ");
println!("3. 困難に立ち向かう");
println!("選択 (1-3): ");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("入力エラー");
let choice: i32 = input.trim().parse().unwrap_or(0);
match choice {
1 => sara.help_friend(&mut becky),
2 => sara.play(),
3 => sara.face_challenge(),
_ => println!("無効な選択です。"),
}
sara.show_status();
}
environment = "屋敷";
sara.adapt_environment(environment);
println!("\nゲーム終了!最終ステータス:");
sara.show_status();
}
💡 特徴
ユーザー入力でサラの行動を選択可能
幸福度・友情度が行動に応じて変化
ランダムイベントで困難の成功/失敗を体験
最終ステータスで達成感を確認
次のステップとしては、
行動の選択肢を増やす
アイテムや追加キャラクターを管理
複数ターンのイベントシナリオ作成
これにより、小公女の物語を完全にプログラムで体験できる簡易ゲームになります。
希望であれば、アイテムや追加キャラクターを含めた完全版のシナリオゲームまで作ることもできます。
作りますか?
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。