Hey Andrey,

Currently I have added a convenience method for my purposes on the interface 
which makes it easier to write requests:
CompletableFuture<PlcReadResponse<?>> response = reader.read(builder -> 
builder.addItem("station", "Allgemein_S2.Station:BYTE"));
This way you are not required to write the same code over again. Maybe this 
helps a bit?

Sebastian

> Am 13.09.2018 um 10:49 schrieb Andrey Skorikov 
> <[email protected]>:
> 
> Hi,
> 
> I believe that if we move the execute() operation to requests, we could also 
> get rid of PlcReader/PlcWriter interfaces altogether, since otherwise they 
> would degenerate to very thin interfaces containing nothing but a single 
> factory method for obtaining PlcReadRequest.Builders. So, in order to execute 
> a read request, instead of:
> 
> PlcReader reader = connection.getReader().get(); // ignore .get() for a moment
> PlcReadRequest request = reader.readRequestBuilder().addItem(...).build();
> reader.read(request);
> 
> we could write:
> 
> connection.readRequestBuilder().get().addItem(...).build().execute();
> 
> Best regards,
> Andrey
> 
> 
> On 09/12/2018 06:21 PM, Christofer Dutz wrote:
>> Hi,
>> 
>> This correlation was just a convenience at the start. I never really liked 
>> it, but wasn't annoying enough to do it.
>> 
>> I would strongly opt for splitting it up into separate classes. Especially 
>> as it generally allows producing read-only only driver versions by excluding 
>> classes from the lib.
>> 
>> Chris
>> 
>> Outlook for Android<https://aka.ms/ghei36> herunterladen
>> 
>> ________________________________
>> From: Andrey Skorikov <[email protected]>
>> Sent: Wednesday, September 12, 2018 4:58:12 PM
>> To: [email protected]
>> Subject: Re: Define execute operation on Request; remove read/write 
>> operations from Reader/Writer
>> 
>> Hi Chris,
>> 
>> no need for a factory-factory. :) I believe that the core problem is
>> that the PlcConnection interface does too much - it offers
>> protocol-specific transport functionality by providing the
>> PlcReader.read operation, it maintains protocol state, and it serves as
>> a factory for read requests (through PlcReader.readRequestBuilder).
>> 
>> Another problem is that the requests, which are obtained through the
>> ReadRequestBuilder are basically independent from a concrete connection
>> instance. Hence it does not make sense to obtain a Builder instance from
>> a PlcConnection. For example, consider the following scenario: first we
>> obtain a PlcConnection, PlcReader and a RequestBuilder off it. Then we
>> close the PlcConnection. What should happen, if we build and try to
>> execute requests from that RequestBuilder? Should it return request
>> instances but throw exceptions when we try to execute them on another
>> (live) connection? Or should it throw exceptions when we call build()?
>> Or should it allow us to execute the built requests on another
>> connection? In the latter case, why should be forced to obtain a request
>> builder from a connection instance anyway?
>> 
>> Best regards,
>> Andrey
>> 
>> 
>> On 09/12/2018 04:21 PM, Christofer Dutz wrote:
>>> Hi Andrey,
>>> 
>>> are you proposing a Factory-Factory? Wouldn't that go a little too far? 
>>> Currently the request factory method being in the connection, is just an 
>>> implementation detail we could have a S7Reader class implementing the 
>>> Reader interface and this is generated from the connection, if this is the 
>>> problem.
>>> 
>>> Chris
>>> 
>>> Am 12.09.18, 15:54 schrieb "Andrey Skorikov" 
>>> <[email protected]>:
>>> 
>>>      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
>>>      >>
>>> 
>>> 
>>> 
> 

Reply via email to