Returning to this discussion.

Here is my position on the matter since this was brought up on the
sync call today

* For internal / non-public and pseudo-non-public APIs that have
return/out values
  - Use Result or Status at discretion of the developer, but Result<T>
is preferable

* For new public APIs with return/out values
  - Prefer Result<T> unless a Status-based API seems definitely less
awkward in real world use. I have to say that I'm skeptical about the
relative usability of std::tuple outputs and don't think we should
force the use of Result<T> for technical purity reasons

* For existing Status APIs with return values
  - Incrementally add Result<T> APIs and deprecate Status-based APIs.
Maintain deprecated Status APIs for ~2 major releases

On Thu, Oct 24, 2019 at 5:16 PM Omer F. Ozarslan <o...@utdallas.edu> wrote:
>
> Hi Micah,
>
> You're right. Quite possible that clang-query counted same function
> separately for each include in each file. (I was iterating each file
> separately, but providing all of them at once didn't change the result
> either.)
>
> It's cool and wrong, so not very useful apparently. :-)
>
> Best,
> Omer
>
> On Thu, Oct 24, 2019 at 4:51 PM Micah Kornfield <emkornfi...@gmail.com> wrote:
> >
> > Hi Omer,
> > I think this is really cool.  It is quite possible it was underestimated (I 
> > agree about line lengths), but I think the clang query is double counting 
> > somehow.
> >
> > For instance:
> >
> > "grep -r Status *" only returns ~9000 results in total for me.
> >
> > Similarly using grep for "FinishTyped" returns 18 results for me.  
> > Searching through the log that you linked seems to return 450 (for "Status 
> > FinishTyped").
> >
> > It is quite possible, I'm doing something naive with grep.
> >
> > Thanks,
> > Micah
> >
> > On Thu, Oct 24, 2019 at 2:41 PM Omer F. Ozarslan <o...@utdallas.edu> wrote:
> >>
> >> Forgot to mention most of those lines are longer than line width while
> >> out is usually (always?) last parameter, so probably that's why grep
> >> possibly underestimates their number.
> >>
> >> On Thu, Oct 24, 2019 at 4:33 PM Omer F. Ozarslan <o...@utdallas.edu> wrote:
> >> >
> >> > Hi,
> >> >
> >> > I don't have much experience on customized clang-tidy plugins, but
> >> > this might be a good use case for such a plugin from what I read here
> >> > and there (frankly this was a good excuse for me to have a look at
> >> > clang tooling as well). I wanted to ensure it isn't obviously overkill
> >> > before this suggestion: Running a clang query which lists functions
> >> > returning `arrow::Status` and taking a pointer parameter named `out`
> >> > showed that there are 13947 such functions in `cpp/src/**/*.h`. [1]
> >> >
> >> > I checked logs and it seemed legitimate to me, but please check it in
> >> > case I missed something. If that's the case, it might be tedious to do
> >> > this work manually.
> >> >
> >> > [1]: https://gist.github.com/ozars/ecbb1b8acd4a57ba4721c1965f83f342
> >> > (Note that the log file is shown as truncated by github after ~30k
> >> > lines)
> >> >
> >> > Best,
> >> > Omer
> >> >
> >> >
> >> >
> >> > On Wed, Oct 23, 2019 at 9:23 PM Micah Kornfield <emkornfi...@gmail.com> 
> >> > wrote:
> >> > >
> >> > > OK, it sounds like people want Result<T> (at least in some 
> >> > > circumstances).
> >> > > Any thoughts on migrating old APIs and what to do for new APIs going
> >> > > forward?
> >> > >
> >> > > A very rough approximation [1] yields the following counts by module:
> >> > >
> >> > >  853 arrow
> >> > >
> >> > >   17 gandiva
> >> > >
> >> > >   25 parquet
> >> > >
> >> > >   50 plasma
> >> > >
> >> > >
> >> > >
> >> > > [1] grep -r Status cpp/src/* |grep ".h:" | grep "\\*" |grep -v Accept 
> >> > > |sed
> >> > > s/:.*// | cut -f3 -d/ |sort
> >> > >
> >> > >
> >> > > Thanks,
> >> > >
> >> > > Micah
> >> > >
> >> > >
> >> > >
> >> > > On Sat, Oct 19, 2019 at 7:50 PM Francois Saint-Jacques <
> >> > > fsaintjacq...@gmail.com> wrote:
> >> > >
> >> > > > As mentioned, Result<T> is an improvement for function which returns 
> >> > > > a
> >> > > > single value, e.g. Make/Factory-like. My vote goes Result<T> for such
> >> > > > case. For multiple return types, we have std::tuple like Antoine
> >> > > > proposed.
> >> > > >
> >> > > > François
> >> > > >
> >> > > > On Fri, Oct 18, 2019 at 9:19 PM Antoine Pitrou <anto...@python.org> 
> >> > > > wrote:
> >> > > > >
> >> > > > >
> >> > > > > Le 18/10/2019 à 20:58, Wes McKinney a écrit :
> >> > > > > > I'm definitely uncomfortable with the idea of deprecating Status.
> >> > > > > >
> >> > > > > > We have a few kinds of functions that can fail:
> >> > > > > >
> >> > > > > > 1. Functions with no "out" arguments
> >> > > > > > 2. Functions with one out argument
> >> > > > > > 3. Functions with multiple out arguments
> >> > > > > >
> >> > > > > > IMHO functions in category 2 are the best candidates for 
> >> > > > > > utilizing
> >> > > > > > Status. In some cases, Case 3 may be more usable Result-based, 
> >> > > > > > but it
> >> > > > > > can also create more work (or confusion) on the part of the 
> >> > > > > > developer,
> >> > > > > > either
> >> > > > > >
> >> > > > > > * The T in Result<T> has to be a struct-like value that 
> >> > > > > > transports
> >> > > > > > multiple pieces of data
> >> > > > >
> >> > > > > The T can be a std::tuple though, so you need not necessarily 
> >> > > > > define a
> >> > > > > dedicated struct type for a single API's return value.
> >> > > > >
> >> > > > >  > Can't say I'm thrilled about having Result<void> or similar for 
> >> > > > > Case
> >> > > > >  > 1-type functions (if I'm understanding what would be the 
> >> > > > > solution
> >> > > > >  > there).
> >> > > > >
> >> > > > > Agreed.
> >> > > > >
> >> > > > > Regards
> >> > > > >
> >> > > > > Antoine.
> >> > > >

Reply via email to