Aşağıdaki kod örneğinde, bir odayı temsil eden değişmez nesneler için bir sınıfımız var. Kuzey, Güney, Doğu ve Batı diğer odalara çıkışları temsil eder.
public sealed class Room
{
public Room(string name, Room northExit, Room southExit, Room eastExit, Room westExit)
{
this.Name = name;
this.North = northExit;
this.South = southExit;
this.East = eastExit;
this.West = westExit;
}
public string Name { get; }
public Room North { get; }
public Room South { get; }
public Room East { get; }
public Room West { get; }
}
Görüyoruz ki, bu sınıf refleks dairesel bir referansla tasarlandı. Ancak sınıf değişmez olduğu için, bir 'tavuk ya da yumurta' sorununa kapıldım. Deneyimli fonksiyonel programcıların bununla nasıl başa çıkacağını bildiğinden eminim. C # ile nasıl ele alınabilir?
Metin tabanlı bir macera oyununu kodlamaya çalışıyorum, ancak sadece öğrenme amacıyla işlevsel programlama ilkelerini kullanmaya çalışıyorum. Bu kavram üzerinde sıkışıp kaldım ve biraz yardım kullanabilirim !!! Teşekkürler.
GÜNCELLEŞTİRME:
İşte Mike Nakis'in tembel başlatma konusundaki cevabına dayanan bir çalışma uygulaması:
using System;
public sealed class Room
{
private readonly Func<Room> north;
private readonly Func<Room> south;
private readonly Func<Room> east;
private readonly Func<Room> west;
public Room(
string name,
Func<Room> northExit = null,
Func<Room> southExit = null,
Func<Room> eastExit = null,
Func<Room> westExit = null)
{
this.Name = name;
var dummyDelegate = new Func<Room>(() => { return null; });
this.north = northExit ?? dummyDelegate;
this.south = southExit ?? dummyDelegate;
this.east = eastExit ?? dummyDelegate;
this.west = westExit ?? dummyDelegate;
}
public string Name { get; }
public override string ToString()
{
return this.Name;
}
public Room North
{
get { return this.north(); }
}
public Room South
{
get { return this.south(); }
}
public Room East
{
get { return this.east(); }
}
public Room West
{
get { return this.west(); }
}
public static void Main(string[] args)
{
Room kitchen = null;
Room library = null;
kitchen = new Room(
name: "Kitchen",
northExit: () => library
);
library = new Room(
name: "Library",
southExit: () => kitchen
);
Console.WriteLine(
$"The {kitchen} has a northen exit that " +
$"leads to the {kitchen.North}.");
Console.WriteLine(
$"The {library} has a southern exit that " +
$"leads to the {library.South}.");
Console.ReadKey();
}
}
Room
örneğiniz.
type List a = Nil | Cons of a * List a
. Ve bir ikili ağacı: type Tree a = Leaf a | Cons of Tree a * Tree a
. Gördüğünüz gibi, ikisi de kendi kendini yönlendiriyor (özyinelemeli). Burada oda tanımlarsınız açıklanmıştır: type Room = Nil | Open of {name: string, south: Room, east: Room, north: Room, west: Room}
.
Room
Sınıfınızın ve List
a'nın tanımının yukarıda yazdığım Haskell'de ne kadar benzer olduğuna bakın .