Public, protected or private with AllowPrivateAccess - Best practices

Seems a bit strange to me to routinely have stuff that’s inaccessible in C++ be accessible via BP?

Exactly. Actually there is a third option BlueprintGetter as discussed in a related thread https://forums.unrealengine.com/t/why-are-blueprintgetter-not-visible/579329.

What I usually see in tutorals is the AllowPrivateAccess option. However, to me this seems more like a workaround. Shouldn’t be made more heavy use of BlueprintGetter and BlueprintSetter? What is the best coding practice?