Hi Sebastian,
good point! The mutability of PlcReadRequest would be a consequence of
the mutability of the PlcConnection (or something that can handle the
execute). However, in order to construct a immutable PlcReadRequest,
currently we still need to obtain a PlcRequest.Builder from the same
mutable PlcConnection. I think, if we really want PlcReadRequest to be
immutable, then we should be able to construct them independently (not
from a mutalbe object). Perhaps we could separate PlcRequest
construction from its exection by providing a RequestBuilder factory
method not on a mutable PlcConnection but "higher up", for example
somewhere on a PlcDriver?
Regards,
Andrey
On 09/12/2018 03:33 PM, Sebastian Rühl wrote:
Hey Andrey,
One thing that would stand against this: Adding a execute() would make the
PlcReadRequest mutable which is a thing we should avoid (Mutable because it
would need a reference store to something that can handle the execute).
FYI: I added a mutability test into plc4j-api (which should be added to
plc4j-driver-bases after the refactoring) which tests all Items for mutability.
Currently we have some open issues regarding that.
Sebastian
Am 12.09.2018 um 14:50 schrieb Andrey Skorikov <[email protected]>:
Hello,
currently, PlcReadRequests and PlcWriteRequests are executed by invoking the
corresponding read/write operation on the PlcReader/PlcWriter objects. Hence
the typical workflow for reading a value contains the following steps:
1. Obtain a PlcReader instance from a PlcConnection
2. Obtain a Builder by invoking readRequestBuilder() on PlcReader
3. Build a request using the Builder
4. Execute the request by invoking read() on the PlcReader, passing the
constructed request as argument
PlcReader reader = ... // obtain reader
PlcReadRequest request = reader.readRequestBuilder().addItem(...).build();
Future<PlcReadResponse> response = reader.read(request);
Since we only can build a request throgh a PlcReader instance, invoking the
read operation on the PlcReader is redundant. Therefore I suggest removing the
read/write operation from the PlcReader/PlcWriter and defining a execute()
operation on PlcRequest instead. The workflow would look like this then:
PlcReader reader = ... // obtain reader
PlcReadRequest request = reader.readRequestBuilder().addItem(...).build();
Future<PlcReadResponse> response = request.execute();
Please note that there is no more need to "keep" a reference to PlcReader in
this context, since it is implicitly associated with the request by calling
reader.readRequestBuilder().build().
Best regards,
Andrey