Comparison of Providence with Apache Thrift
If you are familiar with Apache Thrift
, this is an overview over the
main differences in support between the two systems. The differences are
mostly minute, but all feature changes are there for a reason. Differences
are based on the IDL at thrift.apache.org.
Some features of apache thrift has simply been removed. This is done
in order to simplify both the thrift IDL parsing, and the resulting code
generator. Note that this is the differences between what is supported
and handled by the described IDL. With some few exceptions, all of the
added features are simply ignored by the Apache thrift
compiler.
In addition to this providence also adds a number of
features not supported in apache thrift. Some of these can only be used
in .providence
files, as they also break the thrift syntax, mainly by
adding more keywords that work in different ways than what apache thrift
expects.
Annotations
Annotations in apache thrift is simply noted as "something internal to
facebook", and should not be used. This includes xsd
and some other
keywords. Instead of removing annotations, I explicitly use
annotations for various type modifications. Note that annotations can
only modify what the code generator generates, but are not included
in the type descriptors that are generated.
See details on annotations for more.
Namespaces
Apache Thrift supports a couple of special "namespace" declarations, e.g.
php_namespace
and xsi_namespace
. They have been deprecated in thrift,
but are entirely removed from providence, so the keywords are not recognized
at all, and will fail parsing of the thrift file.
Void methods in services
Since Apache Thrift v0.11.0, using void return type in methods between
Providence and Apache Thrift stopped working. This is because Apache Thrift
decided to remove the implicit 0: void success
field from the generated
response message and recently even started failing if the field was present.
IMHO This is bad protocol design as it creates a false success scenario on a service method call if an exception is added to the call, and the server side is updated, but the client is not. If the server throw the new exception the exception is ignored when parsing the response, and the client believes the call was a success because there was no exception set.
Because of this, this change in Apache Thrift has not been ported to providence. You should change your service calls to use a known return type instead of void if this problem is encountered.
Naming Conflicts
Each code generator needs make getters, setters and mutators using names that are compatible with the language AND compliant to standard styleguides for that language. By using prefixes and name modifications consistently this can be done with some restrictions in order to enable most 'names' to be allowed all over the place.
E.g. the field name 'public' should be allowed for all languages, including java and C++ where it is a reserved word.
Since some languages prefer camelCased names, and other prefer c_cased names, there should be no fields in the same struct with names that will conflict if all '_' are removed, and the entire name is lower-cased. Even though it is a little more complicated than that.
For this to work in Java, we apply the rules:
- All names are camelCased with a prefix for all methods and fields. E.g.
value fields are prefixed
mValue
, getters withgetValue
, params withpValue
etc. No suffixes are used. - getters and setters are prefixed with
set
,addTo
,get
,clear
,mutable
,has
,num
etc.
Or in C++ or python. All the names are initially lower c_cased before included in the code.
- C++: field names are suffixed with
_
. E.g.myField
becomesmy_field_
. - python: field names are prefixed with
__
. E.g.myField
becomes__my_field
. - getters and setters are prefixed with
set_
,get_
,mutable_
,clear_
add_to_
,has_
andnum_
. - This breaks the somewhat spread convention that C++ getters should not have any prefix or suffix, but it makes it possible to use otherwise reserved words as field names.