Roger, I experimented with the import name (rather than dot import), and came up with this:
type Order struct { sync.RWMutex Instrument Id OrderID ExchangeId string Price n.Fixed Side Quantity n.Fixed Remaining n.Fixed OrderType OrderState RejectReason string } But I’m still not sure it’s great. The n (number) has some meaning, and it definitely reads easier than fixed.Fixed, but I what I’m really trying to convey is that “Fixed” is a top-level type, on equal footing with ‘string’. OrderID is declared in this package, so it reads with the desired simplicity, and it just seems wrong that I can’t declare Fixed to have the same treatment just because it comes from another package. Anyway, I’ve read through your proposal, and I didn’t even think it was possible… :) I thought the last segment needed to match the package name. What would be the rationale for not having that be the case (i.e. why is that even supported ?) > On Dec 2, 2018, at 12:33 PM, roger peppe <rogpe...@gmail.com> wrote: > > > Do you really think you are losing information if this becomes: > > > > func matches(p Policy, a authorizer.Attributes) bool { > > From my point of view, yes it makes a big difference if I see a > package-qualified identifier, because I know that it's invoking some other > package's abstraction. I am very often traversing some code that I am not > familiar with, and arbitrary names imported from external packages make that > harder. It also makes it significantly harder to refactor code. > > In short, although there is a cost to qualifying external names, I believe > that cost is justified. > > If you wish to lower the overhead of package qualifiers for frequently used > names, there are alternatives to dot imports. You could specify a short (one > or two character) identifier instead of the default package name. We do this > a lot for some DSL-like packages. You could also define local type aliases - > e.g. type policy = abac.Policy, or local function wrappers (mid-stack > inlining should make that zero-cost at some point). > > FYI I have created a Go proposal related to this that you might wish to give > feedback on: > https://github.com/golang/go/issues/29036#issuecomment-443311975 > <https://github.com/golang/go/issues/29036#issuecomment-443311975> > > On Sun, 2 Dec 2018, 5:59 am robert engels <reng...@ix.netcom.com > <mailto:reng...@ix.netcom.com> wrote: > As some supporting evidence, here is a method signature in k8s: > > func matches(p abac.Policy, a authorizer.Attributes) bool { > > The interesting aspect is that this method is in package abac, except it is > in pkg/auth/authorizer/abac > > and the one being used in the method > > pkg/apis/abac > > Do you really think you are losing information if this becomes: > > func matches(p Policy, a authorizer.Attributes) bool { > > The developer needs to do mental work in either case. I left the authorizer > on purpose, because Attributes is too generic to be useful. Granted, their > package structure seems poor in my opinion, but you can’t talk bad about k8s. > > Here’s an easier example from k8s: > > func (dsc *DaemonSetsController) enqueueDaemonSetAfter(obj interface{}, after > time.Duration) { > > Is that any better than > > func (dsc *DaemonSetsController) enqueueDaemonSetAfter(obj interface{}, after > Duration) { > > And another: > > func deleteOwnerRefStrategicMergePatch(dependentUID types.UID, ownerUIDs > ...types.UID) []byte { > > Is that really better than: > > func deleteOwnerRefStrategicMergePatch(dependentUID UID, ownerUIDs ...UID) > []byte { > > > If you need a package named types, it is probably ubiquitous throughout the > codebase, so using type.UID everyplace is just noise. > > And probably the most common method signature of them all: > http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { > are you losing anything if this is: > http.HandleFunc("/bar", func(w ResponseWriter, r *Request) { > I would argue you are actually gaining something, as the Request above might > be a facade with extra properties etc. The compiler will inform you if you > use an incorrect property, and an IDE will give you the method/properties as > you code, so its completely safe. Now, you might be thinking, request is > pretty generic, so this is not the best example (because a web app probably > has lots of different types of Request, and it could quickly become > confusing, but wait, the http.HandleFunc removes any ambiguity. > > All coding requires good development choices - there are many times it > probably shouldn’t be used - but I making a blanket statement its bad seems > like overreach. > > >> On Dec 1, 2018, at 11:19 PM, Robert Engels <reng...@ix.netcom.com >> <mailto:reng...@ix.netcom.com>> wrote: >> >> I know everyone hates it when I reference java but it has had dot imports at >> the package level since day one. I won’t repeat why that matters. It’s never >> been a problem. >> >> I don’t think I ever heard someone complain it was a problem in working in >> Java, why is it such a problem in Go? I’m suspecting it’s because people’s >> packages are too large in scope so they end importing tons of external >> packages. It’s a structure problem not a language feature problem. >> >>> On Dec 1, 2018, at 11:08 PM, Ian Denhardt <i...@zenhack.net >>> <mailto:i...@zenhack.net>> wrote: >>> >>> Quoting Robert Engels (2018-12-01 22:25:06) >>> >>>> The way to fix it though it just to use dot imports, and encourage it! >>>> The only time dot imports don't work is when there isn't package >>>> stutter. Seems like a no brainer and you get the best of both worlds. >>> >>> My experience in every language I've worked with that has an equivalent >>> of dot imports has been: this is more trouble than it's worth. It hurts >>> readability of large codebases more than any other single language >>> feature I can think of, and this has been my experience in everything >>> from Python to Haskell. >>> >>> It is sometimes nice for DSLs -- Elm has an Html module that just >>> defines a function per html element, and folks usually "dot import" >>> that whole module. But they basically never "dot import" *anything* >>> else, and doing it in the general case is similarly discouraged. In >>> languages where I've seen *common* use of it, I've come to the >>> conclusion that it basically doesn't scale beyond one package, which >>> has to be something that everyone in the language community knows well. >>> In Elm it's Html. In Go it's the set of built-in identifiers. That's all >>> we get. >>> >>> --- >>> >>> There really is something special about a package's "main" type here >>> (when it has one) that makes the stutter a bit hard to work around >>> sometimes. It's a bit unfortunate to have to write context.Context, but >>> nothing *else* in the context package has this problem. Much of the >>> OCaml community has gone with the convention of just calling the type >>> 't' and using the module name to distinguish, and it works pretty well. >>> >>> In Elm you see a lot of this: >>> >>> import Json.Decoder exposing (Decoder) >>> >>> ..which imports the Decoder type from that module unqualified, and >>> leaves the rest qualified. >>> >>> I find it a bit unfortunate that the stuttery approach to naming primary >>> times has ended up being the norm in Go, but I do think idiom is worth >>> something; doing pkg.T is a little surprising to me when reading Go >>> code, even though it isn't when reading OCaml. >>> >>>> People say, it makes things less clear, and I counter that variable >>>> inference is far worse and it's done for the sake of less verbosity, >>>> and people love it... >>> >>> I don't think we're going to agree on this point any time soon, so I'll >>> just say: this does not square with my own experience. >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to golang-nuts+unsubscr...@googlegroups.com >>> <mailto:golang-nuts+unsubscr...@googlegroups.com>. >>> For more options, visit https://groups.google.com/d/optout >>> <https://groups.google.com/d/optout>. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com >> <mailto:golang-nuts+unsubscr...@googlegroups.com>. >> For more options, visit https://groups.google.com/d/optout >> <https://groups.google.com/d/optout>. > > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com > <mailto:golang-nuts+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com > <mailto:golang-nuts+unsubscr...@googlegroups.com>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.