As far as separating implementation from interface, a fairly simple separation
is fields are implementation, methods are interface. While active bindings
allow encapsulated fields (often called "properties"
in other languages), it puts extra cognitive load on the user to remember
which state components are fields and which are returned by methods. Some
frameworks use properties to enable observation of mutable state (see the
objectProperties package on CRAN for doing this with reference classes). But
with reactivity in vogue, it's not clear whether the explicit observer pattern is
still relevant.