In the books I have read they consider null being a special case of behaviour within a method just as confusing as passing a bool like in your illustration.
Andy On Tue, 26 Dec 2017 at 12:19, Andrew Williams <a...@andywilliams.me> wrote: > Hi, > > With the proposal of efl_add and efl_add_child we remove the need for > efl_add_ref* as the result of the former becomes consistent in its return > of owned or not owned references. > Hopefully Cedric can confirm this as I don’t know the spec. > Right now we have a second one because the first is not consistently > returning pointers that either do or do not need to be unrefd. > > Andy > On Tue, 26 Dec 2017 at 04:25, Carsten Haitzler <ras...@rasterman.com> > wrote: > >> On Sun, 24 Dec 2017 09:16:08 +0000 Andrew Williams <a...@andywilliams.me> >> said: >> >> > Are you trolling me now? >> >> no. you said its inconsistent. it's consistent. it has a simple rule. >> >> http://www.dictionary.com/browse/consistent >> >> it consistently adheres to the same principles. i described them. >> >> > A method that does two different things depending on some magic value / >> >> it's not a MAGIC value. it's a parent object handle. it's far from magic. >> it's >> "put this object into THIS box here, or into NO box and give it to me" >> based on >> that option. >> >> > null flag is a code smell (see Clean Coders if this is not familiar). >> > Consider this method: >> > >> > ptr get_mem(string poolname, long bytes) { >> > If (poolname == NULL) >> > return malloc(bytes); // MUST be freed >> > else >> > return get_pool(poolname).borrow(bytes); // must NOT be freed >> > } >> > >> > Do you think that is consistent? The user is not sure without inspecting >> > the parameter contents whether or not the should free(). This is >> > conceptually what we are setting up. >> >> #define efl_add_noparent(klass, ...) efl_add(klass, NULL, ## __VA_ARGS__) >> >> happy? you can have a macro to hide the parent if NULL. but it'll be used >> fairly rarely. >> >> > Back to our efl_add - what would be consistent is this: >> > >> > Eo* efl_add(klass, ... constructors ...); // must be unrefd (no parent) >> > >> > Eo* efl_add_child(klass, parent, ... constructors ... ); // parent must >> not >> > be null, should not be unrefd >> > >> > That is consistent. It is also compliant with the V7 vote. It still has >> the >> > race condition but is much easier to read. I know from the method names >> > what is expected. >> >> your proposal was to have efl_add return void. the above is better for >> sure. i >> see we were walking down similar paths. >> >> i still dislike the above because it just makes the api more verbose for >> the >> sake of special-casing "parent == NULL". i dislike it. this isn't a magic >> "bool" that turns on or off behaviour. that is actually not great. you >> read code >> like >> >> func_do_something(obj, EINA_TRUE, EINA_FALSE, EINA_TRUE); >> >> ... and what are the 3 bools? it's not clear or obvious. but with a >> constructor >> like efl_add firstly it's incredibly common so it's something that will be >> learned very quickly, and the typing already tells you it's an object >> handle. >> and you should have learned already that it's the parent object (or no >> parent >> at all if NULL). >> >> why do i dislike it? we now go from 2 constructors (efl_add and >> efl_add_ref) to >> 4 (efl_add, efl_child_add, efl_add_ref, efl_child_add_ref). i dislike this >> "explosion" just to hide the parent arg being NULL. >> >> > Thoughts? >> > On Sun, 24 Dec 2017 at 03:33, Carsten Haitzler <ras...@rasterman.com> >> wrote: >> > >> > > On Sat, 23 Dec 2017 11:30:58 +0000 Andrew Williams < >> a...@andywilliams.me> >> > > said: >> > > >> > > > Hi, >> > > > >> > > > As this thread seems to be descending into word games and (insert >> > > > appropriate word) contests I will reiterate my concern: >> > > > >> > > > efl_add is inconsistent and that should be addressed. >> > > >> > > do it's not. i explained already that it is not. i'll repeat again. >> it's >> > > consistent: >> > > >> > > if parent == valid object, then ref is owned by parent >> > > else ref is owned by caller/scope. >> > > >> > > that is consistent. >> > > >> > > > I hope that is clear enough >> > > > Andy >> > > > >> > > > >> > > > On Thu, 21 Dec 2017 at 13:15, Andrew Williams <a...@andywilliams.me >> > >> > > wrote: >> > > > >> > > > > Hi, >> > > > > >> > > > > This is now well documented ( >> > > > > https://www.enlightenment.org/develop/tutorials/c/eo-refcount.md) >> but >> > > the >> > > > > more I use efl_add the more I feel it is confusing especially to >> new >> > > > > developers. >> > > > > >> > > > > In the current model (if I understand it correctly) >> > > > > 1) child = efl_add(klass, parent) means the child must NOT be >> > > unfeferenced >> > > > > 2) child = efl_add(klass, NULL) means the child should be >> unreferenced >> > > > > 3) child = efl_add_ref(klass, parent) means the child must be >> > > unreferenced >> > > > > 4) child = efl_add_ref(klass, NULL) somehow means that the child >> > > should be >> > > > > unreferenced twice >> > > > > >> > > > > In my opinion 1) and 4) are peculiar and so I provide a proposal >> to fix >> > > > > this: >> > > > > >> > > > > We could change efl_add to return void. It never retains a >> reference. >> > > If >> > > > > the parent is NULL then it should be automatically unref before >> > > returning. >> > > > > Then efl_add_ref would be changed to mirror this and always retain >> > > exactly >> > > > > 1 reference - so if parent is NULL there is no double count >> returned. >> > > > > >> > > > > Using this model if an Eo * is returned then I know I have a >> reference >> > > and >> > > > > must later unref. >> > > > > Any need for using the pointer in an efl_add (which is no longer >> > > returned) >> > > > > would still be supported through efl_added within the constructor. >> > > > > >> > > > > What do people think about this? I put the suggestion forward to >> > > improve >> > > > > the symettry with add and unref which is currently confusing. If >> my >> > > > > assumptions above are incorrect please let me know! >> > > > > >> > > > > Thanks, >> > > > > Andy >> > > > > -- >> > > > > http://andywilliams.me >> > > > > http://ajwillia.ms >> > > > > >> > > > -- >> > > > http://andywilliams.me >> > > > http://ajwillia.ms >> > > > >> > > >> ------------------------------------------------------------------------------ >> > > > Check out the vibrant tech community on one of the world's most >> > > > engaging tech sites, Slashdot.org! http://sdm.link/slashdot >> > > > _______________________________________________ >> > > > enlightenment-devel mailing list >> > > > enlightenment-devel@lists.sourceforge.net >> > > > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel >> > > > >> > > >> > > >> > > -- >> > > ------------- Codito, ergo sum - "I code, therefore I am" >> -------------- >> > > Carsten Haitzler - ras...@rasterman.com >> > > >> > > -- >> > http://andywilliams.me >> > http://ajwillia.ms >> >> >> -- >> ------------- Codito, ergo sum - "I code, therefore I am" -------------- >> Carsten Haitzler - ras...@rasterman.com >> >> -- > http://andywilliams.me > http://ajwillia.ms > -- http://andywilliams.me http://ajwillia.ms ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel