1
0
mirror of https://github.com/tmrts/go-patterns.git synced 2024-11-22 04:56:09 +03:00

add fleunt interface

This commit is contained in:
apantykhin 2017-09-03 12:28:47 +04:00
parent f978e42036
commit dd6d146ec4
2 changed files with 78 additions and 0 deletions

View File

@ -102,6 +102,7 @@ A curated collection of idiomatic design & application patterns for Go language.
| Pattern | Description | Status |
|:-------:|:----------- |:------:|
| [Functional Options](/idiom/functional-options.md) | Allows creating clean APIs with sane defaults and idiomatic overrides | ✔ |
| [Fluent interface](/idiom/fluent-interace.md) | Method for constructing object oriented APIs focused on better readability | ✔ |
## Anti-Patterns

77
idiom/fluent-interface.md Normal file
View File

@ -0,0 +1,77 @@
# Fluent interface
Fluent interface is a method for constructing object oriented APIs
focused on better readability. Implemented by using method chaining
## Implementation
```go
package fluent
type Align int
const (
Left = iota
Center = iota
Right = iota
)
type TextContainer struct {
Font string
FontSize int
Color string
Align Align
}
func NewTextContainer() *TextContainer {
return &TextContainer{
Font: "Helvetica",
FontSize: 10,
Color: "Red",
Align: Left}
}
func (tc *TextContainer) SetFont (font string) *TextContainer {
tc.Font = font
return tc
}
func (tc *TextContainer) SetFontSize (fontSize int) *TextContainer {
tc.FontSize = fontSize
return tc
}
func (tc *TextContainer) SetColor (color string) *TextContainer {
tc.Color = color
return tc
}
func (tc *TextContainer) SetAlign (align Align) *TextContainer {
tc.Align = align
return tc
}
```
## Usage
```go
func getAlignText(align Align) string{
switch align{
case Left:
return "Left"
case Center:
return "Center"
case Right:
return "Right"
default:
panic("Not determinated align")
}
}
tContainer := NewTextContainer()
tContainer.SetFont("Calibri").SetFontSize(20).SetColor("Green").SetAlign(Center)
fmt.Printf("Font: %s\n", tContainer.Font)
fmt.Printf("Font size: %v\n", tContainer.FontSize)
fmt.Printf("Color: %s\n", tContainer.Color)
fmt.Printf("Align: %s\n", getAlignText(tContainer.Align))
```