From dd6d146ec46a2a67aef74403bf1e0b5910505556 Mon Sep 17 00:00:00 2001 From: apantykhin Date: Sun, 3 Sep 2017 12:28:47 +0400 Subject: [PATCH] add fleunt interface --- README.md | 1 + idiom/fluent-interface.md | 77 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 idiom/fluent-interface.md diff --git a/README.md b/README.md index 7d9f5f7..38456bb 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/idiom/fluent-interface.md b/idiom/fluent-interface.md new file mode 100644 index 0000000..a7a6c92 --- /dev/null +++ b/idiom/fluent-interface.md @@ -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)) +``` \ No newline at end of file