diff --git a/hw6/post.go b/hw6/post.go index 6e1c4f5..f3951bc 100644 --- a/hw6/post.go +++ b/hw6/post.go @@ -10,12 +10,12 @@ func main() { office := *post.NewSortOffice() // Configure senders. - boxSender := func(p post.PackageI) { + boxSender := func(p post.Package) { fmt.Println("BoxSender is sending " + p.PackageType() + " from " + p.SenderAddress() + " to " + p.RecepientAddress()) } office.AddSender(post.BoxPackageType, boxSender) - envelopeSender := func(p post.PackageI) { + envelopeSender := func(p post.Package) { fmt.Println("EnvelopeSender is sending " + p.PackageType() + " from " + p.SenderAddress() + " to " + p.RecepientAddress()) } office.AddSender(post.EnvelopePackageType, envelopeSender) diff --git a/hw6/post/package.go b/hw6/post/package.go index d3a5660..28ff76a 100644 --- a/hw6/post/package.go +++ b/hw6/post/package.go @@ -4,13 +4,13 @@ const BoxPackageType = "box" const EnvelopePackageType = "envelope" // Package interface. -type PackageI interface { +type Package interface { PackageType() string SenderAddress() string RecepientAddress() string } -// box implementation of PackageI +// box implementation of Package type box struct { } @@ -28,7 +28,7 @@ func (b *box) RecepientAddress() string { return "recepient address" } -// Envelope implementation of PackageI +// Envelope implementation of Package type Envelope struct { } diff --git a/hw6/post/sortOffice.go b/hw6/post/sortOffice.go index cd6d1bd..190c23b 100644 --- a/hw6/post/sortOffice.go +++ b/hw6/post/sortOffice.go @@ -4,23 +4,23 @@ import "errors" // Sorting office. type sortOffice struct { - senders map[string]func(PackageI) + senders map[string]func(Package) } // Sorting office constructor. func NewSortOffice() *sortOffice { return &sortOffice{ - senders: make(map[string]func(PackageI)), + senders: make(map[string]func(Package)), } } // Add sender function for each package type. -func (s *sortOffice) AddSender(packageType string, fn func(p PackageI)) { +func (s *sortOffice) AddSender(packageType string, fn func(p Package)) { s.senders[packageType] = fn } // Send package via configured sender function. -func (s *sortOffice) Send(p PackageI) error { +func (s *sortOffice) Send(p Package) error { sendFn, ok := s.senders[p.PackageType()] if !ok { diff --git a/hw6/transport.go b/hw6/transport.go index 365c9cb..cf56b24 100644 --- a/hw6/transport.go +++ b/hw6/transport.go @@ -8,9 +8,15 @@ import ( func main() { route := transport.NewRoute() - car := transport.NewCar() - train := transport.NewTrain() - plane := transport.NewPlane() + car := transport.NewCar(4) + _ = car.TakePassengers(transport.NewPassenger()) + _ = car.TakePassengers(transport.NewPassenger()) + + train := transport.NewTrain(200) + + planeRegistration := transport.NewRegistration() + planeRegistration.AddPassengers(transport.NewPassenger()) + plane := transport.NewPlane(planeRegistration) route.AddTransport(car) route.AddTransport(train) diff --git a/hw6/transport/car.go b/hw6/transport/car.go index e228f60..6e668b6 100644 --- a/hw6/transport/car.go +++ b/hw6/transport/car.go @@ -1,9 +1,17 @@ package transport -type Car struct{} +import ( + "errors" + "strconv" +) + +type Car struct { + maxPassengers int + passengers []*passenger +} -func NewCar() *Car { - return &Car{} +func NewCar(maxPassengers int) *Car { + return &Car{maxPassengers: maxPassengers} } func (c *Car) Name() string { @@ -18,12 +26,17 @@ func (c *Car) Stop() { println("Car stopped") } -func (c *Car) ChangeSpeed() { +func (c *Car) ChangeSpeed(int) error { println("Car changed speed") + return nil } -func (c *Car) TakePassengers() { - println("Car took passengers") +func (c *Car) TakePassengers(p *passenger) error { + if len(c.passengers) == c.maxPassengers { + return errors.New("Cannot take more than " + strconv.Itoa(c.maxPassengers)) + } + c.passengers = append(c.passengers, p) + return nil } func (c *Car) DropPassengers() { diff --git a/hw6/transport/passenger.go b/hw6/transport/passenger.go new file mode 100644 index 0000000..ba5b35e --- /dev/null +++ b/hw6/transport/passenger.go @@ -0,0 +1,7 @@ +package transport + +type passenger struct{} + +func NewPassenger() *passenger { + return &passenger{} +} diff --git a/hw6/transport/plane.go b/hw6/transport/plane.go index 37e5834..d99a1ec 100644 --- a/hw6/transport/plane.go +++ b/hw6/transport/plane.go @@ -1,6 +1,15 @@ package transport -type plane struct{} +import "errors" + +type plane struct { + registration *registration + passengers []*passenger +} + +func NewPlane(registration *registration) *plane { + return &plane{registration: registration} +} func (p *plane) Name() string { return "Plane" @@ -14,17 +23,29 @@ func (p *plane) Stop() { println("Plane stopped") } -func (p *plane) ChangeSpeed() { +func (p *plane) ChangeSpeed(int) error { println("Plane changed speed") + return nil } -func (p *plane) TakePassengers() { - println("Plane took passengers") +func (pl *plane) TakePassengers(p *passenger) error { + // Check if passenger is in registration list. + found := false + for _, pr := range pl.registration.passengers { + if p == pr { + found = true + } + } + + if !found { + return errors.New("passenger not found in registration") + } + + pl.passengers = append(pl.passengers, p) + + return nil } func (p *plane) DropPassengers() { println("Plane dropped passengers") } -func NewPlane() *plane { - return &plane{} -} diff --git a/hw6/transport/registration.go b/hw6/transport/registration.go new file mode 100644 index 0000000..ba27698 --- /dev/null +++ b/hw6/transport/registration.go @@ -0,0 +1,13 @@ +package transport + +type registration struct { + passengers []*passenger +} + +func NewRegistration() *registration { + return ®istration{} +} + +func (r *registration) AddPassengers(p *passenger) { + r.passengers = append(r.passengers, p) +} diff --git a/hw6/transport/route.go b/hw6/transport/route.go index 477ec6f..f6f9448 100644 --- a/hw6/transport/route.go +++ b/hw6/transport/route.go @@ -1,14 +1,14 @@ package transport type route struct { - transport []TransportI + transport []Transport } func NewRoute() *route { return &route{} } -func (r *route) AddTransport(t TransportI) { +func (r *route) AddTransport(t Transport) { r.transport = append(r.transport, t) } diff --git a/hw6/transport/train.go b/hw6/transport/train.go index 84ab2cc..e0c4d1b 100644 --- a/hw6/transport/train.go +++ b/hw6/transport/train.go @@ -1,9 +1,17 @@ package transport -type train struct{} +import ( + "errors" + "strconv" +) + +type train struct { + maxSpeed int + speed int +} -func NewTrain() *train { - return &train{} +func NewTrain(maxSpeed int) *train { + return &train{maxSpeed: maxSpeed} } func (t *train) Name() string { @@ -18,12 +26,20 @@ func (t *train) Stop() { println("Train stopped") } -func (t *train) ChangeSpeed() { - println("Train changed speed") +func (t *train) ChangeSpeed(speedChange int) error { + newSpeed := t.speed + speedChange + + if newSpeed > t.maxSpeed { + return errors.New("speed is over max: " + strconv.Itoa(t.maxSpeed)) + } + + t.speed = newSpeed + return nil } -func (t *train) TakePassengers() { +func (t *train) TakePassengers(*passenger) error { println("Train took passengers") + return nil } func (t *train) DropPassengers() { diff --git a/hw6/transport/transport.go b/hw6/transport/transport.go new file mode 100644 index 0000000..1c40719 --- /dev/null +++ b/hw6/transport/transport.go @@ -0,0 +1,11 @@ +package transport + +// Transport interface. +type Transport interface { + Name() string + Move() + Stop() + ChangeSpeed(speedChange int) error + TakePassengers(p *passenger) error + DropPassengers() +} diff --git a/hw6/transport/transportI.go b/hw6/transport/transportI.go deleted file mode 100644 index 4aa26cc..0000000 --- a/hw6/transport/transportI.go +++ /dev/null @@ -1,11 +0,0 @@ -package transport - -// TransportI interface. -type TransportI interface { - Name() string - Move() - Stop() - ChangeSpeed() - TakePassengers() - DropPassengers() -}