>Looking at the playground again, it seems endpoint writers have two options.
>1) implement either full CRUDer or 2) create a factories for each operation
>individually. Supposing every operation is needed except for the delete (as an
>example), would you expect the implementor to have an extraneous delete
>function, or to create three separate factories?
I don't think that's a common case, and if it is, creating Factories for each
type doesn't seem unreasonable. Each Factory should only be 3 lines,
```
func CreateFactory() api.CreateFactory {
return func(reqInfo *api.APIInfo) api.Creator { return
&TODivision{reqInfo, tc.DivisionNullable{}} }
}
func ReadFactory() api.ReadFactory {
return func(reqInfo *api.APIInfo) api.Reader { return
&TODivision{reqInfo, tc.DivisionNullable{}} }
}
```
In fact, I've wondered if we should just get rid of the `CRUDer` interface, and
require every endpoint to implement its own type. I'm not sure there's really a
reason to keep them together, except saving a few lines of code.
Actually, there's another option too: we could get rid of the factories
altogether, by adding a method to populate the `APIInfo`, `func (v *TODivision)
SetInfo(i *api.APIInfo) { v.ReqInfo = i }`, and changing the "CRUDer" funcs to
take the actual object instead of a factory:
```Go
{1.1, http.MethodGet, `divisions/?(\.json)?$`,
api.ReadHandler(division.TODivision{}), auth.PrivLevelReadOnly, Authenticated,
nil},
```
and then calls `v.SetInfo()` on the object it receives.
Now that I think about it, I like that solution. That fixes the fundamental
issue, that Go polymorphism can't perform duck typing on function parameters.
And IMO factories are a pain to deal with anyway.
What do you think about that solution, getting rid of factories altogether?
That provides the flexibility you want, allowing a type to only implement the
CRUD types it uses, while still preserving type safety, and also being a
simpler and more idiomatic solution than factories.
[ Full content available at: https://github.com/apache/trafficcontrol/pull/2886
]
This message was relayed via gitbox.apache.org for [email protected]