[ 
https://issues.apache.org/jira/browse/MINIFICPP-1264?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Hunyadi updated MINIFICPP-1264:
------------------------------------
    Description: 
*Background:*

In our codebase we have quite a lot of getter functions that follow this 
signature:
{code:c++|title=Current Interface}
void getMemberField(Type& argToModify);
bool getNullableMemberField(OtherType& argToModify);
{code}
Most developers would much rather use an interface that looks like this though:
{code:c++|title=Proposed Interface}
Type& getMemberField();
const Type& getMemberField();
optional<OtherType> getNullableMemberField();
{code}
The problem with the former version is that in some cases it makes the code 
unnecessary verbose. An example from our codebase:
{code:c++|title=Example}
 # Version 1
 utils::Identifier sourceUuid;
 source->getUUID(sourceUuid);
 connection->setSourceUUID(sourceUuid);
 # Version 2
 connection->setSourceUUID(source->getUUID(sourceUuid));
{code}
Unfortunately more ofthen than not this is the exact pattern the getters appear 
in.

*Proposal:*
 As we do not want to break API, we cannot change the getters. However, we can 
resort to implementing a helper utility. A godbolt implementation for a 
convenience function is available here:

[[Proof of 
Concept]|https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAM1QDsCBlZAQwBtMQBGAFlICsupVs1qhkAUgBMAISnTSAZ0ztkBPHUqZa6AMKpWAVwC2tLgDZSW9ABk8tTADljAI0zEuAZlIAHVAsLqtHqGJuY%2BfgF0tvZORq7unF5KKmp0DATMxATBxqacFsmYqoHpmQTRji5unooZWTmh%2BbVlFbHxngCUiqgGxMgcAORSHnbIhlgA1OIeOgoExHbA09jiAAwAgsOj45hTM%2BpzxJjMRstrm5IjtGMGk9M6BmqshACeZxtb1zt7OkaYRiQ3h4Vh9Lttbrt7qhvKlaGx3hcrjc7jMAG5FIjEBGfZGQmZUAzXWHw4HnHHfe4EF7eTAAfXmzEICmxG0OBlUEwA8qx0C8dMIFMyPgB2WQbCYSiao1B4dATYCYAjrCB2AhSMwTTLADpTUWa4jAPYAEU102kuqN50lE1VmuNE04kjNZOFlo8Ys2GwI/28wm9PzGzEFEwAYssJmyOesDQAVamYZ1en1%2BvE6Kk0uF/CYAJUVpAm6a0J12/IU%2BcLmcwADoaxNo8BmaTWfN2QQ67H4/dc22IKWQCAAFQdCD1hQ1qsdcMuj3W71GX3Mf33fwALzpbYcCOtkbbCoItK1upn1slBn8ogL8ftFeLEYI6H7BAMvrpyn%2BWjVMwc%2BbmD5AT5fe5R3HM5gUfTt3StSVxFdRNNlgyCPiTecUx%2BG8s05Zw%2BHLeNK1DQkER3HNFV6WgADV4RFY8JTPRZ22AXMqGvXDb3rOMaXuEMCLA/9k0XXY9wPA17lWZZwI4xD1mtWiL3rZiM1vX9%2ByOAF0VpI4qDcLR%2BiAg1GLE/8II9KCJW7UiKNYCAdWmE0sHYb04OtMziHItgIEwvh1QmVAsPzLjaAmAlaB1EBvKw2kIHVHy%2BC6QLCQioLrNFGDLXFaC0olaE3EXEh6KskyjwK605K1RyTwlJSQDsaUAGtMGoeL82i2l8y1SdJPKiUjifFz9SWDroNgjKJm8BZUX4kACo8gcwr4Wkyolfy4toebJJSuDzltIxGVoKzCuG7leX5IMFALTA5gWiZutI4ietc1gYPNb05nzdVDr5AUFH7PcpPWtahs9QGySQoGQeB0GIfBgYulYEABgAVgGUhTAGVYkdQOGdDkOQIx6PpIUuTgkYIOG0Y6LoapAbhuCrSRuAADjMeGPAATm4VZJHpjx6bZoQ4e4JGUbR0gMYGJGvtWUgSdR6HSDgWAYEQFBUHnPB2DICgIDQVX1ZQYRRE4VYjdIKg1e9YgvogZw4aJ0hnDsTIXhtpHtb%2BehOVoVgnZl0gsG20R2FJpH8COYp0S%2Bn3MAADyKR5BmF1VlGdoQ8GcYhHb0LAg6lhYjGdroaHoJg2A4Hh%2BEEfWxGxmQU%2BcL7YErEAG1YUh0XcZ5vXJkWYUCCOAFpfxsiQZDkThhQmPvOQ8cW32KDQICsBo8i8KxWiqdwLF8fxYSXmot8iWg17iaoCln2FSnqfRchqQo59oC/yjsSpj435pL5CZe38fmJ15AMwugUHjfoXAYZw0RsjbOoso6Mz7mYbgExAwXkNlWVYKCJgQFwIQXKwxOD5j0DrNwUxCY6ixiPGQxMg5d0pvDSWsMBgC1IHnOBKD6aOnhvDYUwpDarDgcKCBPtRbixAJLaWZM5aKwgEgHoBBvCPHIJQbW3g1bVFwZgfAmJBCF0YCwQO9NSAAHd07eHznzBGgtIFwxwRMfRhAEATGgWYWB8DEGGmQag4WojoZdAQMcLA7grKmIYXnDw8Mqws04PTYU1NJCcxZizEJvAhbozhkIkRlCKYgHYVWYU8NEjcDMKseGLMuFmFwXQ6e/DhaCKluk0xkhzECJSTUmWXc27%2BA0NwIAA%3D%3D]

We can introduce this and simplify later usages of getters.

With this, the syntax would simplify to:
{code:c++|title=Using a helper}
 connection->setSourceUUID(ReturnVal(source, &Processor::getUUID));
{code}

  was:
*Background:*

In our codebase we have quite a lot of getter functions that follow this 
signature:
{code:c++|title=Current Interface}
void getMemberField(Type& argToModify);
bool getNullableMemberField(OtherType& argToModify);
{code}
Most developers would much rather use an interface that looks like this though:
{code:c++|title=Proposed Interface}
Type& getMemberField();
const Type& getMemberField();
optional<OtherType> getNullableMemberField();
{code}
The problem with the former version is that in some cases it makes the code 
unnecessary verbose. An example from our codebase:
{code:c++|title=Example}
 # Version 1
 utils::Identifier sourceUuid;
 source->getUUID(sourceUuid);
 connection->setSourceUUID(sourceUuid);
 # Version 2
 connection->setSourceUUID(source->getUUID(sourceUuid));
{code}
Unfortunately more ofthen than not this is the exact pattern the getters appear 
in.

*Proposal:*
 As we do not want to break API, we cannot change the getters. However, we can 
resort to implementing a helper utility. A godbolt implementation for a 
convenience function is available here:

[[Proof of 
Concept]|https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAM1QDsCBlZAQwBtMQBGAFlICsupVs1qhkAUgBMAISnTSAZ0ztkBPHUqZa6AMKpWAVwC2tQVvQAZPLUwA5YwCNMxENwBspAA6oFhdbT1DE0FvXzU6Kxt7IycXd0VlTFV/BgJmYgJA41NOBJVw2lT0gki7R2dXDwU0jKzg3Ori0ujYyoBKRVQDYmQOAHIpAGZrZEMsAGpxQZ1q4mtgKexxAAYAQSGRscxJ6fVZzGYjRZX1yWHaUYMJqZ0DNVZCAE9jtY2LrZ2dI0wjEmfBpavM6bK7bG6oTwFNgvU7nS7XaYANySRGIMLe8LB0yoBguUNY6OB71BnwIj08mAA%2BgRiMxCAp0WtZgZVOMAPKsdCPHTCBQM14Adlka3GovGiNQeHQ42AmAIqwg1gIUjc43SwDakyFauIwB2ABE1VNpFr9ScxeMlWqDeNOJJjeaxUqAFTjBw22gGVisSFowbC9YCs3%2Bk4nAg/TzCcOfUbMPnjABii3GzNZq11ABVyZgHWtw0ZI8xozcyRTaIdtgAlOWkcalrQV8Y8hS1%2Bvl74AOi743TwAZAJOqYIPcz2Zu1eHEGbIBAzraEF7Ci7HbaydDQsdovzheL018AC8qcPbDCLUOZXLKeqtQGLRaDL5RHXsza243qugZwQDJGqYlvvQNy2LWH5fj%2B7A3Iuy7HACX5jiGIpiuIQa5oGwYBmGEZRliOhvt87IOHwrbZu22wJriMLnhO3S0AAatCgq3mKD7zCOwDVlQr4kY2vZZhSNzkbQixflhRbbLKBBXrqNzLMJID1qh96PnqvZcWW74EJ%2BIDED8qDIpSOlUM4Wi9JBuocXJCkIesiGitRxB0WwECalMhpYOw4aKWK9mOawEBsoRKrjKghG1oJ4w4rQmogMFhGUhAKohXwHQRbi8WRS5G4obZkw5apEnOZuN5FRaqnql5d4pppM7WBKADWmDUGltZJZStbqqu1mVaKOnfg5OoLF1SHZasFqeHMiJiSARUBXwrqtRVia4qltCUqhyHoaGaxWkYdK0M5xU5RyXI8nGCh1pg1SLb1NHjD59EEtq4bVLWKrHdyvIKDOEmjRtHYFZ1GEjVtNmgyD4OvJDYNQyDfQdKwIB9AArH0pCmH0yyo6giM6HIcgpl0PRgmcnCowQiOY20HR1a43AdpI3AABxuEjgwAJzcMskiM4MjMc0IiPcKj6OY6Q2N9KjX3LKQ5MY3DpBwLAMCICgqAFng7BkBQEBoOrmsoMIoicMsJukFQGvhsQX0QA4iOk6QDjWOkjx26jusAQQbK0KwLty6QWC7aI7AU6j%2BA6ckyJfX7mAAB5JHc/Si0qyiu0IeAOLSxDchgidk3MRiux0ND0EwbAcDw/CCIbYh4zIacOF9sCkSAfasKQyIuA84ZU2LkL%2BFHAC0H6uRIMhyJwArjAPbKDJLiTJBoEDmHUOSkOYzTlC4uShH4dAryEPi77QG8xBUDTzwURS1Po2SCEo%2BQpDUJTWGUp9b4oT/7w0T8n60nAdAoQmvQuDw0RijNGIcxaIxjszAebhuDjFjE%2BY2HZlioPGBAXAhASCTBJrWPQetnC4MGP/JstdpBkxDj3GmSNpYIz6ELUgBd4GoMZnaJGSMBQCmNsseBAoIF%2B3FpLEA0tZaUwVsrCASAugEE8HccglBdaeA1mfNe%2BBUSCGLowFgwdGakAAO60k8IXAWyNhaQPFkMTg4x9GEAQOMGBbg4EIKQXqFBaDRZiLhh0BABwsAuGcqYxhBdBhIw7GzTgjMBTcG4JIbmbM2ahN4CLLGiNhGiKodTEAHCOwCiRpwQY7hlhIzZtwtwuR6GzwEaLIRMtMmmMkOYwRaS6lyx7h3XwGhuBAA%3D%3D%3D]

We can introduce this and simplify later usages of getters.

With this, the syntax would simplify to:
{code:c++|title=Using a helper}
 connection->setSourceUUID(ReturnVal(source, &Processor::getUUID).get());
{code}


> Add getter interface helper
> ---------------------------
>
>                 Key: MINIFICPP-1264
>                 URL: https://issues.apache.org/jira/browse/MINIFICPP-1264
>             Project: Apache NiFi MiNiFi C++
>          Issue Type: Improvement
>    Affects Versions: 0.7.0
>            Reporter: Adam Hunyadi
>            Assignee: Adam Hunyadi
>            Priority: Minor
>             Fix For: 0.8.0
>
>
> *Background:*
> In our codebase we have quite a lot of getter functions that follow this 
> signature:
> {code:c++|title=Current Interface}
> void getMemberField(Type& argToModify);
> bool getNullableMemberField(OtherType& argToModify);
> {code}
> Most developers would much rather use an interface that looks like this 
> though:
> {code:c++|title=Proposed Interface}
> Type& getMemberField();
> const Type& getMemberField();
> optional<OtherType> getNullableMemberField();
> {code}
> The problem with the former version is that in some cases it makes the code 
> unnecessary verbose. An example from our codebase:
> {code:c++|title=Example}
>  # Version 1
>  utils::Identifier sourceUuid;
>  source->getUUID(sourceUuid);
>  connection->setSourceUUID(sourceUuid);
>  # Version 2
>  connection->setSourceUUID(source->getUUID(sourceUuid));
> {code}
> Unfortunately more ofthen than not this is the exact pattern the getters 
> appear in.
> *Proposal:*
>  As we do not want to break API, we cannot change the getters. However, we 
> can resort to implementing a helper utility. A godbolt implementation for a 
> convenience function is available here:
> [[Proof of 
> Concept]|https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAM1QDsCBlZAQwBtMQBGAFlICsupVs1qhkAUgBMAISnTSAZ0ztkBPHUqZa6AMKpWAVwC2tLgDZSW9ABk8tTADljAI0zEuAZlIAHVAsLqtHqGJuY%2BfgF0tvZORq7unF5KKmp0DATMxATBxqacFsmYqoHpmQTRji5unooZWTmh%2BbVlFbHxngCUiqgGxMgcAORSHnbIhlgA1OIeOgoExHbA09jiAAwAgsOj45hTM%2BpzxJjMRstrm5IjtGMGk9M6BmqshACeZxtb1zt7OkaYRiQ3h4Vh9Lttbrt7qhvKlaGx3hcrjc7jMAG5FIjEBGfZGQmZUAzXWHw4HnHHfe4EF7eTAAfXmzEICmxG0OBlUEwA8qx0C8dMIFMyPgB2WQbCYSiao1B4dATYCYAjrCB2AhSMwTTLADpTUWa4jAPYAEU102kuqN50lE1VmuNE04kjNZOFlo8Ys2GwI/28wm9PzGzEFEwAYssJmyOesDQAVamYZ1en1%2BvE6Kk0uF/CYAJUVpAm6a0J12/IU%2BcLmcwADoaxNo8BmaTWfN2QQ67H4/dc22IKWQCAAFQdCD1hQ1qsdcMuj3W71GX3Mf33fwALzpbYcCOtkbbCoItK1upn1slBn8ogL8ftFeLEYI6H7BAMvrpyn%2BWjVMwc%2BbmD5AT5fe5R3HM5gUfTt3StSVxFdRNNlgyCPiTecUx%2BG8s05Zw%2BHLeNK1DQkER3HNFV6WgADV4RFY8JTPRZ22AXMqGvXDb3rOMaXuEMCLA/9k0XXY9wPA17lWZZwI4xD1mtWiL3rZiM1vX9%2ByOAF0VpI4qDcLR%2BiAg1GLE/8II9KCJW7UiKNYCAdWmE0sHYb04OtMziHItgIEwvh1QmVAsPzLjaAmAlaB1EBvKw2kIHVHy%2BC6QLCQioLrNFGDLXFaC0olaE3EXEh6KskyjwK605K1RyTwlJSQDsaUAGtMGoeL82i2l8y1SdJPKiUjifFz9SWDroNgjKJm8BZUX4kACo8gcwr4Wkyolfy4toebJJSuDzltIxGVoKzCuG7leX5IMFALTA5gWiZutI4ietc1gYPNb05nzdVDr5AUFH7PcpPWtahs9QGySQoGQeB0GIfBgYulYEABgAVgGUhTAGVYkdQOGdDkOQIx6PpIUuTgkYIOG0Y6LoapAbhuCrSRuAADjMeGPAATm4VZJHpjx6bZoQ4e4JGUbR0gMYGJGvtWUgSdR6HSDgWAYEQFBUHnPB2DICgIDQVX1ZQYRRE4VYjdIKg1e9YgvogZw4aJ0hnDsTIXhtpHtb%2BehOVoVgnZl0gsG20R2FJpH8COYp0S%2Bn3MAADyKR5BmF1VlGdoQ8GcYhHb0LAg6lhYjGdroaHoJg2A4Hh%2BEEfWxGxmQU%2BcL7YErEAG1YUh0XcZ5vXJkWYUCCOAFpfxsiQZDkThhQmPvOQ8cW32KDQICsBo8i8KxWiqdwLF8fxYSXmot8iWg17iaoCln2FSnqfRchqQo59oC/yjsSpj435pL5CZe38fmJ15AMwugUHjfoXAYZw0RsjbOoso6Mz7mYbgExAwXkNlWVYKCJgQFwIQXKwxOD5j0DrNwUxCY6ixiPGQxMg5d0pvDSWsMBgC1IHnOBKD6aOnhvDYUwpDarDgcKCBPtRbixAJLaWZM5aKwgEgHoBBvCPHIJQbW3g1bVFwZgfAmJBCF0YCwQO9NSAAHd07eHznzBGgtIFwxwRMfRhAEATGgWYWB8DEGGmQag4WojoZdAQMcLA7grKmIYXnDw8Mqws04PTYU1NJCcxZizEJvAhbozhkIkRlCKYgHYVWYU8NEjcDMKseGLMuFmFwXQ6e/DhaCKluk0xkhzECJSTUmWXc27%2BA0NwIAA%3D%3D]
> We can introduce this and simplify later usages of getters.
> With this, the syntax would simplify to:
> {code:c++|title=Using a helper}
>  connection->setSourceUUID(ReturnVal(source, &Processor::getUUID));
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to