...
There is another problem. isProvidedBy and isUsedBy use the exact same grammatical form for the name. Yet, one is for exclusive use with Relative things, and the other is not. It would be nice if there was a hint about this. Given that use with relative things should be the exception rather than the rule, we could have a convention to highlight that the propery is for use with only Relative Things. The same solution can apply to subclasses of ThingInRole.
Common names like Asset and Bank cannot be used in the common sense way because they are subclasses of a the class: ThingInRole. There are two things:
- An independent party that is a corporation that provides banking services. We use the term “Bank” for this in everyday parlance. It is a real thing.
- A party in the role of a bank: an independent corporation providing banking services. There is no everyday parlance for this, it is a fiction created to solve complex modeling scenarios about roles that occasionaly arise . FIBO calls this a Bank.
This is backwards, the thing with no common name should have a name that gives some hint that it is the fictitious thing that means PartyInTheRoleOfABank, and the common everyday thing that people call a bank should be called Bank in FIBO. ThingsInRole: should be hidden from view, and only used on occasion, not baked into FIBO infrastructure.
Proposed Solution:
IDEALLY: have the non-ThingInRole name be the usual name that you expect, e.g. isProducedBy, and if you want one that is only to be used for ThingsInRole then append _R to the name. e.g. isProducedBy_R. This way you can see that the two properties are linked, one is defined as a property chain using the other. Subclasses of ThingInRole, like Asset and Bank should be renamed to Asset_R and Bank_R and Bank and Asset should be used to mean what every one will think they mean. In this world, there may be a handful of classes and properties that have an _R suffix, and most will not.
ALTERNATIVE: A less disruptive (and hopefully temporary) option that can be implemented immediately is to use the suffixes as needed when creating a version that is not there. For example, I created a property called isProducedBy_I for what I needed above. Now it is clearly linked to the other version. All the ThingInRole classes like Bank and Asset can have their IndependentParty versions called Bank_I & Asset_I. I needed to have a new Class called CreditRepository, but I sure don't want the _R version. For now, given the current naming convention, I will create a class called CreditRepository_I and not bother creating the _R version since I cannot imagine a time when it would be needed.
ReFactoring Suggestions
...