From 761e816936ded24eb09db51abe8fa4321473890a Mon Sep 17 00:00:00 2001 From: Evgeniy Fedorov Date: Fri, 30 Jun 2023 15:14:05 +0300 Subject: [PATCH 1/4] Removed 'I' from interface names --- hw6/post.go | 4 ++-- hw6/post/package.go | 6 +++--- hw6/post/sortOffice.go | 8 ++++---- hw6/transport/route.go | 4 ++-- hw6/transport/transportI.go | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) 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/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/transportI.go b/hw6/transport/transportI.go index 4aa26cc..2548bd7 100644 --- a/hw6/transport/transportI.go +++ b/hw6/transport/transportI.go @@ -1,7 +1,7 @@ package transport -// TransportI interface. -type TransportI interface { +// Transport interface. +type Transport interface { Name() string Move() Stop() From 6639548288982abf7dc70dc6a706d3e8cfde2bda Mon Sep 17 00:00:00 2001 From: Evgeniy Fedorov Date: Fri, 30 Jun 2023 15:30:57 +0300 Subject: [PATCH 2/4] Car can take max 4 passengers --- hw6/transport.go | 5 ++++- hw6/transport/car.go | 22 ++++++++++++++----- hw6/transport/passenger.go | 3 +++ hw6/transport/plane.go | 3 ++- hw6/transport/train.go | 3 ++- hw6/transport/{transportI.go => transport.go} | 2 +- 6 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 hw6/transport/passenger.go rename hw6/transport/{transportI.go => transport.go} (79%) diff --git a/hw6/transport.go b/hw6/transport.go index 365c9cb..cbc57c0 100644 --- a/hw6/transport.go +++ b/hw6/transport.go @@ -8,7 +8,10 @@ import ( func main() { route := transport.NewRoute() - car := transport.NewCar() + car := transport.NewCar(4) + _ = car.TakePassengers(&transport.Passenger{}) + _ = car.TakePassengers(&transport.Passenger{}) + train := transport.NewTrain() plane := transport.NewPlane() diff --git a/hw6/transport/car.go b/hw6/transport/car.go index e228f60..2d86149 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 { @@ -22,8 +30,12 @@ func (c *Car) ChangeSpeed() { println("Car changed speed") } -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..d224fbb --- /dev/null +++ b/hw6/transport/passenger.go @@ -0,0 +1,3 @@ +package transport + +type Passenger struct{} diff --git a/hw6/transport/plane.go b/hw6/transport/plane.go index 37e5834..3aae712 100644 --- a/hw6/transport/plane.go +++ b/hw6/transport/plane.go @@ -18,8 +18,9 @@ func (p *plane) ChangeSpeed() { println("Plane changed speed") } -func (p *plane) TakePassengers() { +func (p *plane) TakePassengers(*Passenger) error { println("Plane took passengers") + return nil } func (p *plane) DropPassengers() { diff --git a/hw6/transport/train.go b/hw6/transport/train.go index 84ab2cc..84def60 100644 --- a/hw6/transport/train.go +++ b/hw6/transport/train.go @@ -22,8 +22,9 @@ func (t *train) ChangeSpeed() { println("Train changed speed") } -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/transportI.go b/hw6/transport/transport.go similarity index 79% rename from hw6/transport/transportI.go rename to hw6/transport/transport.go index 2548bd7..0c2c237 100644 --- a/hw6/transport/transportI.go +++ b/hw6/transport/transport.go @@ -6,6 +6,6 @@ type Transport interface { Move() Stop() ChangeSpeed() - TakePassengers() + TakePassengers(p *Passenger) error DropPassengers() } From 1941ea43f00618ed96388b4d51c0cc57493a8380 Mon Sep 17 00:00:00 2001 From: Evgeniy Fedorov Date: Fri, 30 Jun 2023 15:52:40 +0300 Subject: [PATCH 3/4] Plane can only take registered passengers. --- hw6/transport.go | 9 ++++++--- hw6/transport/car.go | 4 ++-- hw6/transport/passenger.go | 6 +++++- hw6/transport/plane.go | 31 +++++++++++++++++++++++++------ hw6/transport/registration.go | 13 +++++++++++++ hw6/transport/train.go | 2 +- hw6/transport/transport.go | 2 +- 7 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 hw6/transport/registration.go diff --git a/hw6/transport.go b/hw6/transport.go index cbc57c0..c1faca9 100644 --- a/hw6/transport.go +++ b/hw6/transport.go @@ -9,11 +9,14 @@ func main() { route := transport.NewRoute() car := transport.NewCar(4) - _ = car.TakePassengers(&transport.Passenger{}) - _ = car.TakePassengers(&transport.Passenger{}) + _ = car.TakePassengers(transport.NewPassenger()) + _ = car.TakePassengers(transport.NewPassenger()) train := transport.NewTrain() - plane := transport.NewPlane() + + 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 2d86149..5ec0025 100644 --- a/hw6/transport/car.go +++ b/hw6/transport/car.go @@ -7,7 +7,7 @@ import ( type Car struct { maxPassengers int - passengers []*Passenger + passengers []*passenger } func NewCar(maxPassengers int) *Car { @@ -30,7 +30,7 @@ func (c *Car) ChangeSpeed() { println("Car changed speed") } -func (c *Car) TakePassengers(p *Passenger) error { +func (c *Car) TakePassengers(p *passenger) error { if len(c.passengers) == c.maxPassengers { return errors.New("Cannot take more than " + strconv.Itoa(c.maxPassengers)) } diff --git a/hw6/transport/passenger.go b/hw6/transport/passenger.go index d224fbb..ba5b35e 100644 --- a/hw6/transport/passenger.go +++ b/hw6/transport/passenger.go @@ -1,3 +1,7 @@ package transport -type Passenger struct{} +type passenger struct{} + +func NewPassenger() *passenger { + return &passenger{} +} diff --git a/hw6/transport/plane.go b/hw6/transport/plane.go index 3aae712..9aec193 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" @@ -18,14 +27,24 @@ func (p *plane) ChangeSpeed() { println("Plane changed speed") } -func (p *plane) TakePassengers(*Passenger) error { - 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/train.go b/hw6/transport/train.go index 84def60..7edee8f 100644 --- a/hw6/transport/train.go +++ b/hw6/transport/train.go @@ -22,7 +22,7 @@ func (t *train) ChangeSpeed() { println("Train changed speed") } -func (t *train) TakePassengers(*Passenger) error { +func (t *train) TakePassengers(*passenger) error { println("Train took passengers") return nil } diff --git a/hw6/transport/transport.go b/hw6/transport/transport.go index 0c2c237..a20de29 100644 --- a/hw6/transport/transport.go +++ b/hw6/transport/transport.go @@ -6,6 +6,6 @@ type Transport interface { Move() Stop() ChangeSpeed() - TakePassengers(p *Passenger) error + TakePassengers(p *passenger) error DropPassengers() } From 2ae3996650ddd0a88b52c159cbb9cc5830a0174d Mon Sep 17 00:00:00 2001 From: Evgeniy Fedorov Date: Fri, 30 Jun 2023 15:59:44 +0300 Subject: [PATCH 4/4] Train cannot go over 200 km speed. --- hw6/transport.go | 4 ++-- hw6/transport/car.go | 3 ++- hw6/transport/plane.go | 3 ++- hw6/transport/train.go | 25 ++++++++++++++++++++----- hw6/transport/transport.go | 2 +- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/hw6/transport.go b/hw6/transport.go index c1faca9..cf56b24 100644 --- a/hw6/transport.go +++ b/hw6/transport.go @@ -12,8 +12,8 @@ func main() { _ = car.TakePassengers(transport.NewPassenger()) _ = car.TakePassengers(transport.NewPassenger()) - train := transport.NewTrain() - + train := transport.NewTrain(200) + planeRegistration := transport.NewRegistration() planeRegistration.AddPassengers(transport.NewPassenger()) plane := transport.NewPlane(planeRegistration) diff --git a/hw6/transport/car.go b/hw6/transport/car.go index 5ec0025..6e668b6 100644 --- a/hw6/transport/car.go +++ b/hw6/transport/car.go @@ -26,8 +26,9 @@ 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(p *passenger) error { diff --git a/hw6/transport/plane.go b/hw6/transport/plane.go index 9aec193..d99a1ec 100644 --- a/hw6/transport/plane.go +++ b/hw6/transport/plane.go @@ -23,8 +23,9 @@ func (p *plane) Stop() { println("Plane stopped") } -func (p *plane) ChangeSpeed() { +func (p *plane) ChangeSpeed(int) error { println("Plane changed speed") + return nil } func (pl *plane) TakePassengers(p *passenger) error { diff --git a/hw6/transport/train.go b/hw6/transport/train.go index 7edee8f..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,8 +26,15 @@ 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(*passenger) error { diff --git a/hw6/transport/transport.go b/hw6/transport/transport.go index a20de29..1c40719 100644 --- a/hw6/transport/transport.go +++ b/hw6/transport/transport.go @@ -5,7 +5,7 @@ type Transport interface { Name() string Move() Stop() - ChangeSpeed() + ChangeSpeed(speedChange int) error TakePassengers(p *passenger) error DropPassengers() }