概要
Swiftで関数をペアで扱い、スタックのような操作をシミュレートする方法を紹介します。特に、追加や削除、生成や消費といった操作を1対1で設計することで、コードの整合性や管理がしやすくなることを目的としています。
今回は「果物を育てる」から「果物を売る・食べる」といった具体的なシチュエーションを使って、関数の対になる動作をわかりやすく表現してみました。
背景
あるプロジェクトで、関数を1対1で設計するように指示がありました。例えば、リソースを「追加する」関数がある場合、その逆の操作(「削除する」)も用意するという指針です。
このアイデアを応用して、ビジネスや生活の中で行われる動作(育てる、卸す、売る、食べる)を関数でペアリングし、スタックのような流れでシミュレーションしてみます。
実装例
1. FruitManagerクラス
以下が果物を管理するクラスFruitManagerです。このクラスでは、果物を育てたり、卸したり、売ったり、食べたりする操作ができます。それぞれの操作は対になる形で関数が存在しており、スタックのように順に処理されます。
import XCTest
// 果物を管理するクラス
class FruitManager {
private var fruits: [String] = []
// 果物を育てる
func growFruit(_ fruit: String) {
fruits.append(fruit)
print("\(fruit) を育てました。")
}
// 果物を卸す
func wholesaleFruit(_ fruit: String) {
if let index = fruits.firstIndex(of: fruit) {
print("\(fruit) を卸しました。")
} else {
print("\(fruit) は育てていないので卸せません。")
}
}
// 果物を売る
func sellFruit(_ fruit: String) {
if let index = fruits.firstIndex(of: fruit) {
print("\(fruit) を売りました。")
} else {
print("\(fruit) は卸されていないので売れません。")
}
}
// 果物を食べる
func eatFruit(_ fruit: String) {
if let index = fruits.firstIndex(of: fruit) {
fruits.remove(at: index)
print("\(fruit) を食べました。")
} else {
print("\(fruit) は存在しないので食べられません。")
}
}
// 現在の果物リストを表示
func printFruits() {
print("現在の果物リスト: \(fruits)")
}
}
2. 関数ペアのシミュレーション
次に、果物を育て、卸し、売り、食べるという一連の流れをシミュレーションするクラスを作ります。このクラスでは、growFruit()とeatFruit()、wholesaleFruit()とsellFruit()がそれぞれ対になった操作を行います。
// 関数のスタック操作を模倣したシナリオ
class FruitOperationsSimulation {
private let fruitManager = FruitManager()
// 果物の育成と操作をシミュレート
func simulate() {
print("シミュレーション開始")
// 1. 果物を育てる
fruitManager.growFruit("Apple")
fruitManager.growFruit("Banana")
// 2. 果物を卸す
fruitManager.wholesaleFruit("Apple")
// 3. 卸した果物を売る
fruitManager.sellFruit("Apple")
// 4. 残っている果物を食べる
fruitManager.eatFruit("Banana")
// 現在のリストを表示
fruitManager.printFruits()
print("シミュレーション終了")
}
}
// シミュレーション実行
let simulation = FruitOperationsSimulation()
simulation.simulate()
実行結果
このシミュレーションを実行すると、以下のような結果が得られます。
シミュレーション開始
Apple を育てました。
Banana を育てました。
Apple を卸しました。
Apple を売りました。
Banana を食べました。
現在の果物リスト: []
シミュレーション終了
growFruit() と eatFruit(): 果物を育てて、最終的に消費する操作のペア。
wholesaleFruit() と sellFruit(): 卸して売るという商業的な操作のペア。
まとめ
この実装では、1対1の関数をペアで設計することで、処理の流れを明確にし、スタックのような順序で関数を実行できる形を作りました。これにより、コードの整合性を保ちやすくし、さらにビジネスや日常生活における一連の流れをシンプルに表現できます。
関数のペアリングは、シンプルな操作を分かりやすく設計するのに非常に有効です。実際のプロジェクトでも、リソースの管理やアクションの実行に対して、こうしたペアの設計を取り入れると、保守性の高いコードが書けるでしょう。