A bit of a long pause but I was busy...
Re:
>> ... But RPC in itself is about making compromises on AJAX use ("obscure"
payload, asymmetrical payload because they were not meant to be parsed by
the same tools and in the same environments, everything sent to the URLs,
etc. all of this make it impractical at best to use RPC along with, for
example, service workers), and that will eventually degrade the web
experience for users. Moving away from RPC is actually trading development
"convenience" for a better user experience.
Development convenience = better developer experience. End-user experience
has nothing to do with obscure or asymmetrical payloads. That is an
implementation detail. It is also something that can be changed, improved
if it needs to be.
Re all recommendations for other frameworks:
Thanks, but many of us are aware of them and they do not solve the problem.
It is important to note that there are differences in the problems being
solved by these. One kinds deals with exposing network-accessible APIs to
3rd part clients. The other kind is *strictly* intended for internal
communication.
The first generally dictates the API definition first, in some way that can
be used across versions and with different languages and other
technologies. None of this is important in the second case. What is
important is the efficiency of making calls between two parts of the same
product (client, server). That *very* much so includes developer
convenience, because they will have more time to work on what matters.
Furthermore, by focusing on the same language on both ends of the
connection it becomes possible to actually share code and avoid pitfalls
that many make when attempting to create their own approaches (even if it
means using ready-made frameworks - one would have to map language
features).
Examples of where GWT RPC *COULD* excel and others fail miserably:
i) Development convenience - speed of development, more time left for
what matters.
ii) Development convenience - less risk of defect due to forgotten
configuration or otherwise.
iii) Development convenience - less to learn, quicker to start. No need
to learn anything new re how to configure/annotate anything to make the
class serializable.
iv) Development convenience - shared code - same code can be used
everywhere, no separation into client and server.
v) Support for cyclic graphs - Object "A" can reference "B" and "B" can
reference "A". If you send both, you still have two objects to deal with,
not four or infinity. This *is* important.
vi) Runtime performance (yes!) - because of (v).
vii) Runtime performance (yes!) - because developers can rely on highly
optimized framework implementation that "knows" exactly what is under the
hood and is not overly generic. It can directly reference generated
JavaScript code (as obfuscated) as needed and, thus, shorten both payloads
and execution time.
viii) Works out of box
ix) Does not need any extra frameworks to be brought in, version
matched, etc.
x) Can follow (Java) language improvements in step with GWT.
xi) Emulates more of Java - specifically "Serializable".
xii) "I can use 3rd party code that does NOT have to know anything about
the framework I am using and I don't have to teach it anything either".
xiii) Works with private fields too.
Note:
1. Yes, GWT compiler has to analyze a lot to figure out serialization. But
so would any other framework that would attempt to do as much. At the same
time, being a part of the compiler, GWT RPC processing can actually cache a
lot and significantly shorten the compilation time - base Java and GWT
libraries do NOT change within the scope of use of a single GWT SDK and
third party libraries change rarely. Furthermore, it seems to me based on
observations, that GWT goes over the analysis multiple times (i.e. does not
cache stuff even in memory, at least in part).
2. Yes, GWT RPC is downright NASTY to apply as it is today. But this can
be improved greatly. We wrapped it to address that, inside GWT this would
be easier. For us it is enough to annotate a method of a server class with
a single annotation to make it appear on the client side, as *that* method,
in *that* class, without having to (hand-) create any interfaces. We can
also combine and batch calls - in fact they all go through one single GWT
RPC method of a single service. For example, if there was a "Server" class
in the server and it had methods "log(Object)" and
"getRandomNumberGenerator()", one *could* invoke
Server.log(Server.getRandomNumberGenerator().generateRandomNumber()) by
writing exactly that line of code, client or server. Disclaimer: in this
case the client would not be aware of the end result/success of that.
Passing an additional AsyncCallback argument to the Server.log(...) call
would allow for that too - it does in our implementation. Note that this
approach mostly utilizes the serialization ability of GWT RPC and it only
uses a single method for all communication. All this is done by a set of
base classes (that are entirely generic) and annotation-triggered code
generation (based on server-side code annotations). Client code or common
code (serializable classes) do not need to be annotated at all.
3. As "clou...gmail.com" suggests, version skew is NOT a negative in this
context ... and this is a huge context. It is actually positive. At the
same time, this is not unsolvable at all.
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.