はてなキーワード: オブジェクトとは
コードを簡潔に保つにはモジュール化が必須である。しかし同じモジュールに関係のない機能が含まれていたりすると混乱の元になる。
一方で、関数というのは引数の細かな仕様に依存せずに、汎用的に呼び出せた方が何かと好都合だ。引数になんらかのオブジェクトを渡し、そのオブジェクトしか持ち得ないような特殊な情報で処理を行なったりすると、関数とオブジェクトが互いに依存しあってしまう。
これはモジュールの結合度と呼ぶ。
高い凝集度、低い結合度によってモジュールを作れば、保守性は上がる。
さらにモジュール内では、公開する必要のない関数はprotectedまたはprivateにするべきだ。
そのためにはモジュールが公開すべき関数についてインターフェイスを作り、公開関数に対するユニットテストを書いておくのが良いだろう。
意外なほど反応ついてたけど読まず返事せず続ける。というか言いたいことの1割も書いてないので返事してたら続けられない。
読み返しててアズレンとブルアカが混ざっててどっちの話だかわからなくなってるが、すまん。
神バハだって当時すごい盛り上がって楽しかっただろというのは自分もそうですはい。
三目並べだって楽しめれば別にゲームとして欠陥あっても関係ないというのもその通り。
この場合、ゲームデザインとして実際のゲーム内容とゲームのルックが嚙み合ってないのが、よろしくないと感じる理由になる。
つまり、なんか雰囲気がドルフロに似てるなあという類似が、ゲームの性質からくるのではないと考えるからだ。
ゲームジャンルが同じだと見た目が同じになるのはむしろ当たり前。ファイアーエムブレムとラングリッサーが見た目が似てると言って怒るのは…譬えが悪かった。
艦これとアズールレーンでいうと、艦これはジャンル分けが難しいオリジナルジャンルだがああいうゲームで、アーケード艦これは3Dのアクション?ゲーム。アズールレーンは2Dシューティング。アズレンがアーケード艦これのルックにあえて似せる必要は特にない。が、実際、なんかそれっぽくなってしまってる。
パクリではない。キャラクターは独自の2Dに落とし込んであるし、ゲームシステムも違う。別物である。
ただ、軍艦モチーフのヒット作の後追いで出た軍艦モチーフゲームのゲーム画面の全体のルックが、ゲームシステム上の要請によるものでなく、なんとなく似てる。
おそらくは、参考にしました、ということだろう。
アズレンの場合、一番近いのは二次創作同人ゲーだと思う。キャプテン翼のやおい同人誌を商業向けに絶愛にしました、みたいな…譬えが悪いか。
気にする奴は気にするが、気にしないやつは気にしない、ただネタ元へのリスペクトは本当にあるんか? と思いたくなるような微妙な感じだ。
この場合、似てるから悪いのではなく、似てないことが気持ち悪さの原因になっている。別にネタ元のニュアンスをあえて残す必要がないのに残ってしまってるのが、単なる素材として雑に扱ってるんだろうなと感じるのである。自分は。
ブルアカでも、同様の、パクリではないけど…を感じ取ってしまう。
基本的にゲームシステムは生煮えである。2Dキャラがちょこまかと動きまわり、いろんなアクションを取るところが一番のセールスポイントであるのは間違いないが、それを使ってゲームシステムとしてうまくできてるかというと、見た目がちょっと豪華になっただけというのが正直なとこだろう。
プレイヤーが操作可能な範囲とゲーム画面のルックがうまく繋がってない。範囲攻撃の範囲指定ぐらいだろうか。回避指示はごく少数の特定キャラしか使えないし。AIオートにすると本当に頭が悪すぎるのでスキル使用はプレイヤー操作するしかないのだが、正直、ここまでオートが使い物にならない理由がわからないぐらい使えなさすぎる。なんとかゲームっぽさを演出しようとして、プレイヤーのやることを無理やり残すためにオートをあえて役立たずにしたのではないかと疑っている。
美少女が実銃で銃撃する動作を頑張って作ろうという熱意は凄くある。あるが、ゲームにはならなかった。
銃と美少女という組み合わせだけが先行してて、後が続かなかった。
さて2D銃撃部分ではグラフィックが先行してゲームデザインが追い付かなかったという話なのだが、そうなると気になるのが「もう一方のゲーム画面」であるフロアマップ。
メインと銘打ったステージで見れるのだが、これは完全に、まったく、寸分の違いもなくドルフロそのまま。ユニットの動かしかたまで同じだし、マップ上のオブジェクトも似てる。
ドルフロでは、マップはゲームの中心部分として機能していた。最初に見ると艦これの海域マップみたいに見えるが上手くアレンジしてあって、要は戦術シミュレーションのマップの簡略化した形だ。ゲームデザインとしての中心部分なので先に進むほどマップが大きくなり難易度が上がり、そのうちスマホだとマップを見ることすら不可能みたいなことになり(ゲーム公式がPCエミュでのプレイを推奨してたぐらい)、ライトユーザーが引くぐらいなことになるのだが、そのぐらいゲームとしての意味がちゃんとあった。
ブルアカでのマップは、ドルフロの凶悪マップを反面教師としたのだろう、基本的に戦術シムみたいなことは一切ない。というかやらせてくれない。代わりにボタン押しギミックがやたら増えた。
結果、マップはあっても、実際のユニットの移動ルートは実質1つだけ、というのが現在のブルアカのマップである。この部分はトライアンドエラーで運営の用意した正解を引くパズルみたいなもので、プレイヤーのやれることはほぼない。こうなってくると、マップ攻略はほぼ作業でしかなく、こんなことやらせず戦闘だけ抜き出して置いておけばいいだろ、という気分になってくる。
書いてみて思ったが、自分がドルフロとブルアカを対比してしまうのは、かなりの部分ここだと思った。ドルフロは艦これフォロワーとして作られたがゲーム部分は独自性が強く、艦これから受け継いだように見える部分でも自作品に合わせるように作り変えてあり、ゲームのルックとゲームデザインの間に乖離がない。ブルアカはドルフロから全く変えずに完コピしたが、(おそらくソシャゲとして楽に遊べるようにするためにという思惑もあって)その完コピした部分はゲームとしての機能を失い煩雑なだけの盲腸となってしまってる(かといってマップをなくすのも微妙かもしれない。先述したように2Dキャラ銃撃部分はプレイヤーがやることがあるように見えて少ない、基本的にキャラを愛でるためのパートだ。形骸化してるとはいえマップをなくしてしまうと、ただでも少ないゲームっぽさがさらに失われてしまうことになる)
ドルフロと同じなことについて「真似した」以外の理由が思い浮かばなくなってしまっている。このへんの真似っぽさは「銃と美少女」というセールス部分からは外れたとこなので雑にやっつけちゃったんだろうが、ここがあるからこそ、「銃と美少女の組み合わせなんて過去にいくらでも前例がある、別にドルフロは関係ない」と言いづらくなっている。ゲームシステムとしての合理性がありプレイヤーのゲーム体験としてうまく昇華させていれば、同じジャンルだから似てるだけと言えてたはずだ。
自分がブルアカのゲームデザインが雑なのが、単に雑であるよりあかんとこだと思う理由は、上記となる。
まだまだ続きます。
見た通り基本お気持ち表明なのでそのように。
これだから3Dオブジェクトのコピペゲーをなんとも思わず消費するSteamユーザーは嫌いなんだ
ゲームってのはパン作りのように粉からこねて自分で作ってこそクリエイターの思想が反映されるってもんだ
それすらこだわる気がないのに、見栄えのするゲームを手抜きで量産していくことに、意味はあるのか!
それは最終的に、人がゲームから受けるセンス・オブ・ワンダーを損ね、薄味なゲーム文化体験を推進してしまうことになる
ゲームにおけるQoLが下がればゲームという産業それ自体がパチンコのようなものに成り下がってしまうおそれがある!
事実、買い切りだからという紛い物の安心感のために、クリエイターたちの血と汗が数百円で安売りセールされる地獄がそこにあるだろ!
そういう環境を作ってるのはあんたらだ! そうなれば作り手もいかに手抜きしつつ一発当てるかしか考えなくなる! ソシャゲと同じだろ!!
同じ2Dスプライトやドットキャラ、聞いたことあるBGMを使いまわすようなRPGツクールゲーばかりになった世の中を想像してみろ!
それはDLsiteでは現実になってるが、同人だからこそ許されてるもんだろ
module_name.pyみたいなモジュールごとにファイル分割して、インターフェイスだけ公開してその他はdef _funcみたいにprotected(or private)にしとく。
でも「共通性がありそうだから共通関数にする」はアンチパターンだな。たまたま共通してただけの場合は分岐コードが増えて共通関数の保守コストが上がる。
あとありがちなのは、php開発者が関数分割しないですべてメインコードにべた書きするケース。こういうのはやめないと保守が大変。
とっておきのクズがやりがちなのは、神オブジェクトを作るとかだな。Userクラスのフィールドに関係する機能が多いからといって、コンポジションなどによるクラス分割をせずにユーザークラスにあらゆるフィールドとメソッドを追加して、さらに進むとユーザーとは無関係な機能も含めすべてをユーザークラスに定義するアフォ。こうなってしまったら、後から修正するのが難しくなる。
先に手を打つことが、プログラマーの素質「怠惰」につながるのであり、面倒臭いといって後回しにするのは美徳でもなんでもない。
ingressを離れた諸氏は知らないだろうが、最近のingressには、OVER CLOCK HACKなるものがある。簡単にいえば3D版グリフハックだ。
お馴染みのグリフが3DのARオブジェクト上に表示されるので、それを解読・記憶して2Dのグリフを入力する。
そうすると、正解率に応じてとんでもない量のアイテムがもらえるというミニゲームだ。
私は元々ingressのグリフハックが好きで、グリフとそれらを組み合わせた頻出熟語(例:human + civilization)や、LV8のグリフハックのパターン(例:create + pure + future + human + civilization)も結構覚えてる。
しかし、そんなグリフハック好きな私でも、OC HACKだけは無理だ。
難易度が高いからこそリソースが沢山もらえるってことなんだろうが、ミニゲームとしての完成度が低過ぎて、やっててストレスしか溜まらない。本当につまらん。
石川の能登は冷やかしどころかボランティアすら断るほどインフラが壊滅していて、現地入りした人が色々と叩かれてるけど、ぶっちゃけSNSにあげるかどうかは別として震災直後の現地を観光してみたいって気持ちはある
311のときの東北は津波で街が流されていて壊滅した瓦礫ばかりである意味圧巻だったようだが、残念なことにそれを見ることなく終わってしまった
なお、そこから1年後に現地入りしてもまだ瓦礫が残っていて被災地としての風情があった(意訳)と知人が言っていたけどね
例の奇跡の一本松とかは今は立派な観光名所になってるがあれはただのレプリカで、本物は震災直後の数週間でしか見れなかった(塩害で死んだので)
岩手の大槌町では建物上に乗り上げた船とか風光明媚なオブジェクトもあったがあえなく解体されたんだが、むしろああいうの残しておけば観光地として生きながらえて過疎地にならずすんだはず
まだ産まれてないが阪神・淡路大震災の崩壊した高速道路とかああいうのもさっさと解体撤去されたけど、ああいう非現実的なものを見れた人が羨ましい
石川の被災地は風情のある古民家が多いしプチ京都みたいな町並みだったが、それが倒壊しまくってる姿は、まさに東京大空襲や関東大震災のときの東京を彷彿とさせてくれるのではないか
これは見たい・・・是非とも見てみたい・・・そういう思いがムクムクと元旦からこみあげてくる
というので連休はまだまだ続くので、被災地入りしてみようかなと思っている
今は関西の某所に住んでいるが、石川の首都である金沢はほとんど無傷でインフラは生きているので、そこまで車や公共交通機関で行ったあとあとは自転車あたりで能登半島まで行ってみたい
例の倒壊した輪島塗の五島屋とか特に立ち入り制限されてないらしいから真っ先に見て写真とってこようと思う
でも炎上はしないだろうね
僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています。
以下のコードを実行してデータを追加し続けると、一定のサイズを超えるとエラーが出てしまうみたいです。
理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。
もし詳しい人がいたらご教示お願い致します。
import sys import os import mmap import hashlib def h(x): return int(hashlib.sha512(x.encode()).hexdigest(), 16) def create_db(filename): with open(filename, 'wb') as f: f.write(b'\0' * 1024 * 1024) # 1MBの空ファイルを作成 def set_key(filename, key, value): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): f.seek(0, os.SEEK_END) f.write(b'\0' * mm.size()) # ファイルサイズを2倍にする mm = mmap.mmap(f.fileno(), f.tell()) # ファイルサイズを反映させる pos = h(key) % mm.size() # ハッシュ値を再計算する data = key + '\0' + value + '\0' data = data.encode() mm[pos:pos+len(data)] = data mm.close() # mmapオブジェクトを閉じる def get_key(filename, key): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() if mm[pos:end].decode() == key: pos = end + 1 end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() value = mm[pos:end].decode() mm.close() # mmapオブジェクトを閉じる return value pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): break mm.close() # mmapオブジェクトを閉じる return None def main(): cmd = sys.argv[1] if cmd == 'create': create_db(sys.argv[2]) elif cmd == 'set': set_key(sys.argv[2], sys.argv[3], sys.argv[4]) elif cmd == 'get': print(get_key(sys.argv[2], sys.argv[3])) if __name__ == '__main__': main()
コードを書く上で重要なことは?という質問に対して、アスペならば「実行できること」と答えるだろう。
当たり前なことしか言っていない。「実行できること」という文からは全く有益な知見を得られない。
実行できることは重要性ではなく、必要性である。重要性とは、必要なことをすべてやった上でなおやる価値のあることを意味する。
そう考えた時に私がよく思うのは「最短時間で理解可能」であることが重要であると思うわけである。
しかしここに宗教がある。そもそも、人間が物事を理解するプロセスは人それぞれである。
私は一度、関数やモジュールで適切に分離するためのリファクタリングというものを行ったことがある。
というのも、一つの関数に万を超える行が書かれていたため、上司がリファクタリングを命令したためである。
具体的詳細はprivateメソッドに、公開する必要のあるものはpublicメソッドに移した。
そして当初働いていた職場での反応はどうだったかというと、「スパゲッティコード」だというのだ。
スパゲッティコード?一つの関数に万を超える行があるほうがスパゲッティだと普通は思うだろう。
ところが、彼らの脳内では、「常にコードの詳細が見えていなければ気がすまない」という、カプセル化を無視する思想で動いていたため、関数化すると関数の最下層まで辿らないと気がすまないらしかったのである。
このようにして、教育の無い人間はコードの読み方もカプセル化も知らないので、非生産的な方法が最短の方法になってしまうのである。
コードを最短で理解するためにはどうするのか。基礎知識を教育された集団の中に身を置くのがまず先決である。
例えばcalc_monthly_salary_yen(Person p)という行が存在した時、いちいちcalc_monthly_salary_yenの中身を常に見に行くような人たちはダメだ。
「人間のデータを入力すれば円単位で月の給料を計算してくれるんだろう」とざっくりと自然言語的に読み進められる人たちでなければ「最短理解」は難しい。
開発手法でしっくり来てるのがAndy HuntさんのTracer Bullet Developmentで、開発の方向性を示すのに試作を作る方法。
1. 主要なシステム オブジェクトを定義。UI、サーバー、ロジックビット、データベース抽象化レイヤー等。
3. データフローを実現するために API とその戻り値をコーディング。
4. 単体テストを使用して API の予想される使用法を文書化。
5. 各 API に必要な量の既定のデータ (別名、ダミー データ、偽のデータ、ハードコーディングされたデータ) を追加して、API が「実行」されるようにする。
6. あらかじめ用意されたデータを実際の機能に段階的に置き換える。
お前のいう通り書いたったわ(C#だが)。
//宇宙 namespace Universe { //あらゆる神の根底に存在する唯一神とその司る運(スーパークラス) public class GodLuck { public string Name { get; } //神の名前 public string Power { get; } //神の力 public string Plan { get; } //神の計画 public string Factor { get; } //運の要因 public GodLuck(string name, string power, string plan, string factor) { Name = name; //神の名前 Power = power; //神の力 Plan = plan; //神の計画 Factor = factor; //運の要因 } //神が何かを創造するメソッド public void Create(string thing) { Console.WriteLine($"{Name} created {thing}."); } //神が何かに対して支配や介入をするメソッド public void Control(string thing, string action) { Console.WriteLine($"{Name} {action} {thing}."); } //運が何かに対して影響を与えるメソッド public void Affect(string thing, string outcome) { Console.WriteLine($"{Name} affected {thing} and the outcome was {outcome}."); } } //恵比須様 public class EbisuSama : GodLuck { public EbisuSama() : base("恵比須様", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") { } //作物を守る public void Save(string crops) { Control(crops, "守る"); } //人間を成功させる public void MakeSuccessful(string person) { Affect(person, "成功"); } } }
(大いなる力を別のクラスに移譲したくなったが、神と大いなる力は同一のオブジェクトという要件があるからやめた)
//宇宙 namespace Universe { //神の振る舞いを定義したインターフェイス public interface IGodLuck { public string Name { get; } public string Power { get; } public string Plan { get; } public string Factor { get; } //神が何かを創造するメソッド public void Create(string thing); //神が何かに対して支配や介入をするメソッド public void Control(string thing, string action); //運が何かに対して影響を与えるメソッド public void Affect(string thing, string outcome); } //恵比須様 public class EbisuSama : IGodLuck { public string Name { get; } //神の名前 public string Power { get; } //神の力 public string Plan { get; } //神の計画 public string Factor { get; } //運の要因 public EbisuSama() { Name = "恵比須様"; //神の名前 Power = "商売繁盛や五穀豊穣の力"; //神の力 Plan = "人々に幸せを与える計画"; //神の計画 Factor = "商売繁盛や五穀豊穣の要因"; //運の要因 } //神が何かを創造するメソッド public void Create(string thing) { Console.WriteLine($"{Name} created {thing}."); } //神が何かに対して支配や介入をするメソッド public void Control(string thing, string action) { Console.WriteLine($"{Name} {action} {thing}."); } //運が何かに対して影響を与えるメソッド public void Affect(string thing, string outcome) { Console.WriteLine($"{Name} affected {thing} and the outcome was {outcome}."); } //物を守る public void Save(string thing) { Control(thing, "守る"); } //人間を成功させる public void MakeSuccessful(string person) { Affect(person, "成功"); } } }
馬鹿がオブジェクト指向をやると一つのクラスに全部の機能を突っ込んだりする
そういう状態になったものを神クラスといい、インスタンス化したものは神オブジェクトという
EchsSee(仮)という謎のクラスに全機能が詰め込まれていた
最初はHTMLの表示をデバイスごとに振り分けるヘルパークラスでしかなかったが、馬鹿が「便利だから」などといって無関係のフィールドとメソッドをどんどんEchsSeeに詰め込んだ
EchsSeeは高頻度に更新される上に、更新による失敗が全システムに影響を与えたため、開発者は「EchsSee触るの怖いんですよね」などと言うようになった
万物に神が宿り、万物が神になる世界なので、神が人や世界を支配しない
『西洋宗教において神と運は別のオブジェクトだが、日本の古典な宗教観においては神や大いなる力は同一のオブジェクト』、これを生成させるまではうまくいったんだけどね
bingちゃん:
西洋宗教では、神と運は、プログラムでたとえると、別々のオブジェクトとして存在すると考えられます。神は、人間や自然に対して意志や計画を持つ創造者や支配者として表現されます。運は、人間や自然に対して予測や制御ができない偶発的な要因として表現されます。
# 神と運のオブジェクトを定義する class God: def __init__(self, name, power, plan): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") class Luck: def __init__(self, name, factor): self.name = name # 運の名前 self.factor = factor # 運の要因 def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このコードでは、神と運は、それぞれ異なる属性や機能を持つオブジェクトとして定義されています。神は、名前、力、計画という属性と、創造、支配という機能を持ちます。運は、名前、要因という属性と、影響という機能を持ちます。神と運は、それぞれの機能を使って、人間や自然に対して作用することができます。例えば、以下のようなコードが考えられます。
# 神と運のオブジェクトを作成する god = God("Zeus", "lightning", "maintain order") luck = Luck("Tyche", "chance") # 神と運が人間に対して作用する god.create("human") luck.affect("human", "good") god.control("human", "bless") luck.affect("human", "bad") god.control("human", "punish")しかし、日本の古典的宗教観では運と神や大いなる力は同じオブジェクトです。神が運を司っています。
# 神と運は同一のオブジェクトとして定義する class GodLuck: def __init__(self, name, power, plan, factor): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 self.factor = factor # 運の要因 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このように、神と運は同一のオブジェクトとして扱われます。例えば、恵比寿さまは商売繁盛や五穀豊穣の神であり、同時にそのような運をもたらす要因でもあります。以下がその例です。
# 恵比寿さまのオブジェクトを作る ebisu = GodLuck("恵比寿さま", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") # 恵比寿さまが何かを創造する ebisu.create("鯛") # 恵比寿さまが何かに対して支配や介入をする ebisu.control("農作物", "守る") # 恵比寿さまが何かに対して影響を与える ebisu.affect("商人", "成功")恵比寿さま created 鯛. 恵比寿さま 守る 農作物. 恵比寿さま affected 商人 and the outcome was 成功.
日本語で聞いてるのになんでその回答になるんだよ、面倒くせぇ
ぜんぜん中立じゃないじゃんな
具体的にはBingちゃんが神の計画・神の支配の文言含んだ回答を生成しちゃったら
日本は八百万の神がいる世界。万物に神が宿り、万物が神になる世界なので、神が人や世界を支配しない
『西洋宗教において神と運は別のオブジェクトだが、日本の古典な宗教観においては神や大いなる力は同一のオブジェクト』、これをBingちゃんに生成させるまではうまくいったんだけどね
bingちゃん:
西洋宗教では、神と運は、プログラムでたとえると、別々のオブジェクトとして存在すると考えられます。神は、人間や自然に対して意志や計画を持つ創造者や支配者として表現されます。運は、人間や自然に対して予測や制御ができない偶発的な要因として表現されます。
# 神と運のオブジェクトを定義する class God: def __init__(self, name, power, plan): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") class Luck: def __init__(self, name, factor): self.name = name # 運の名前 self.factor = factor # 運の要因 def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このコードでは、神と運は、それぞれ異なる属性や機能を持つオブジェクトとして定義されています。神は、名前、力、計画という属性と、創造、支配という機能を持ちます。運は、名前、要因という属性と、影響という機能を持ちます。神と運は、それぞれの機能を使って、人間や自然に対して作用することができます。例えば、以下のようなコードが考えられます。
# 神と運のオブジェクトを作成する god = God("Zeus", "lightning", "maintain order") luck = Luck("Tyche", "chance") # 神と運が人間に対して作用する god.create("human") luck.affect("human", "good") god.control("human", "bless") luck.affect("human", "bad") god.control("human", "punish")しかし、日本の古典的宗教観では運と神や大いなる力は同じオブジェクトです。神が運を司っています。
# 神と運は同一のオブジェクトとして定義する class GodLuck: def __init__(self, name, power, plan, factor): self.name = name # 神の名前 self.power = power # 神の力 self.plan = plan # 神の計画 self.factor = factor # 運の要因 def create(self, thing): # 神が何かを創造するメソッド print(f"{self.name} created {thing}.") def control(self, thing, action): # 神が何かに対して支配や介入をするメソッド print(f"{self.name} {action} {thing}.") def affect(self, thing, outcome): # 運が何かに対して影響を与えるメソッド print(f"{self.name} affected {thing} and the outcome was {outcome}.")このように、神と運は同一のオブジェクトとして扱われます。例えば、恵比寿さまは商売繁盛や五穀豊穣の神であり、同時にそのような運をもたらす要因でもあります。以下がその例です。
# 恵比寿さまのオブジェクトを作る ebisu = GodLuck("恵比寿さま", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") # 恵比寿さまが何かを創造する ebisu.create("鯛") # 恵比寿さまが何かに対して支配や介入をする ebisu.control("農作物", "守る") # 恵比寿さまが何かに対して影響を与える ebisu.affect("商人", "成功")恵比寿さま created 鯛. 恵比寿さま 守る 農作物. 恵比寿さま affected 商人 and the outcome was 成功.