DIA Opdracht 4 (Arjan Dekker) Place klasse: #Deze klasse wordt gebruikt in zowel de client als de server #Daarom deze klasse in apart bestand gezet, die geinclude wordt #door zowel de server als client class Place #automatisch get functies aangemaakt attr :row attr :seatnumber #deze moet ook ge set worden, door true wordt automatisch een set functie aangemaakt attr :cr_number, true #de constructor def initialize(row, seatnumber) @row = row @seatnumber = seatnumber
Client: #!/usr/bin/ruby #Distributed ruby en de place klasse zijn nodig, dus includen require 'drb/drb' require 'place.rb' #poort en plaats waar server op draait SERVER_URI = "druby://localhost:8787" #starten van de service DRb.start_service bios_service = DRbObject.new_with_uri(SERVER_URI) #weergeven van een welkomsbericht print "Welkom bij de BiosFactory\n" #Loopen tot applicatie gesloten wordt loop do #inlezen van wat gegevens print "Voer bioscoopnaam in: " bios = gets #de bioscoop wordt of aangemaakt of gereturned indien deze bestaat bioscoop = bios_service.get_bioscoop(bios)
#inlezen van wat gegevens print "Voer Rij in (A..Z): " rij = gets #inlezen van wat gegevens print "Voer stoelnr in (1..50): " seatnr = gets #nieuw place object aanmaken en doorgeven aan server print "Kaartje kost: ", bioscoop.getprice(place.new(rij.chop!,seatnr.chop!)), "\n" #inlezen van wat gegevens print "Kaartje kopen? (j/n): " answer = gets answer.chop! #indien kaartje te duur of iets dergelijks, dan plaats niet reserveren if answer == "j" print "Voer creditcard nummer in: " creditcardnr = gets #booksingleseat uitvoeren op server met een nieuw aangemaakte instantie van de place klasse bioscoop.booksingleseat(place.new(rij, seatnr), creditcardnr)
#Overzicht uitprinten (niet nuttig maar dit laat alleen zien dat het werkt ; ) ) print bioscoop.printsummary() #aantal geboekte plaatsen weergeven (niet nuttig maar dit laat alleen zien dat het werkt ; ) ) print "aantal plaatsen: ",bioscoop.getnumberofseats(),"\n\n"
Server: #!/usr/bin/ruby #Distributed ruby en de place klasse zijn nodig, dus includen require "drb/drb" require 'place.rb' #poort en plaats waar server op draait URI = "druby://localhost:8787" #De klassen waarvan de server instanties bijhoudt class Bioscoop #dit nodig om een referentie van het object door te geven include DRb::DRbUndumped #De constructor def initialize(bios_name) @bios_name = bios_name @places = [] #functie retouneerd de prijs (boeken van een rij voor rij F is duurder dan achterin de zaal) def getprice(pl) if pl.row < "F" return 10 else return 7
#retouneerd het aantal geboekte plaatsen def getnumberofseats() return @places.size #genereerd een overzicht van alle plaatsen die geboekt zijn. def printsummary() summary = summary, "Overzicht #{@bios_name}" summary = summary, "Plaatsen die geboekt zijn:\n" #de array met plaatsen langs van deze betreffe bioscoop @places.each { i summary = summary, i.row,i.seatnumber, " betaald met cr_nummer :", i.cr_number, "\n" } #geeft een lijst met geboekte plaatsen terug return "#{summary}" #returned de naam van de bioscoop def getbiosname() return @bios_name #voegt een geboekte plaats toe aan de places array def booksingleseat(pl,cr_number) pl.cr_number = cr_number @places.push(pl)
#De factory pattern klasse (maakt instanties van het bioscoop object aan, als deze nog niet bestaat #en geeft de juiste bioscoop terug als erom gevraagd wordt. class BiosFactory def initialize() @bioscopen = {} #geeft de bioscoop terug waarom gevraagd wordt. #bestaat deze niet dan wordt er een nieuw object aangemaakt en deze wordt terug gegeven. def get_bioscoop(name) #check of object al bestaat if!@bioscopen.has_key? name #bestaat nog niet dus nieuwe aanmaken @bioscopen[name] = Bioscoop.new(name) #bestaat wel dus de juiste terug geven return @bioscopen[name] #Server Object aanmaken (nodig om mee te kunnen communiceren) SERVER_OBJECT = BiosFactory.new() #Service wordt gestart $SAFE = 1 DRb.start_service(URI, SERVER_OBJECT) DRb.thread.join