On 27/05/16 20:47, Stefano Forli wrote: > I welcome this discussion because it addresses some of the issues I had when > starting > contributing to the code. > > I'm partially responsible of several convenience functions (IsSulfoneOxygen, > to name one > :), and I would be happy to have a guideline to follow to deal with the issue. > > The rationale is: I've been schooled by experienced programmers to keep > functions as > simple as possible in order to limit bugs (like that rock band in which they > paint their > faces black and white). > > Prior to my patch, IsHbondAcceptor was just a handful of lines, and adding > features made > it grow to several 'pages' of source. Adding convenience functions was an > attempt to > improve code clarity and reduce chances of bugs. > Although, I agree with Noel in terms of not creating ad-hoc functions which > are used only > once. If there's a way to group them together to keep them isolated from the > main code (or > not public?), I'm fine with it. > I'm a big fan of generalizations over special cases. > > A similar thing is happening for the OBBond::IsEster function, but in this > case I don't > know how to deal with new features. > I've tried fixing a possible bug and extend the functionalities, so the code > went from 29 > to 296 lines (including some documentation/comments). > In order to cover all esters accordingly to IUPAC (and Wikipedia, of course), > I ended up > in writing extra functions that are called by IsEster itself, but can still > be called > independently: > > IsEster: > ->IsPhosphateEster > ->IsCarboxyEster > ->IsThioEster > > As a consequence, the ABI would change too, and IsEster now could accept > several extra > boolean flags to deal with these extra features (before it accepted none). > > I think these extra functions could be considered convenience functions. In > principle, the > whole code could be in a single, larger function, which will have one > well-defined behavior. > > Although, I think this would imply the inability to customize the behavior of > IsEster, and > limit the access to new features. > > In a possible scenario, a user could call IsEster(), and then write its own > code to get > discriminate between the different ester types. Since the function already > did the job, > why not make it available directly? > > I'm aware that this is a complex reply to what was a simple and well-posed > point, but I > would appreciate to have such aspects clarified to prevent bad coding > practices to sneak > in the project. > > It would be great if eventually such guidelines would land in a nice and small > "Guidelines" page for OB developers and contributors. > The simplest way around this which would not change the API more than once is to have a function called
enum FunctionalGroup OBMol::functionalGroup() {} with enum { FunctionalGroup_PhosphateEster, FunctionalGroup_Amine, FunctionalGroup_Alcohol }; In this manner support for new functional groups can be added under the hood without changing the interface. > Thanks! > > S > > > > On 05/27/2016 08:24 AM, Noel O'Boyle wrote: >> I was just going to make the point that I'm not too keen on the >> majority of the additions to OBAtom and OBMol, which appear to be >> convenience functions. Consider IsSulfoneOxygen. There are a lot of >> elements out there and a lot of functional groups; we should either >> add them all or add none. If in the end, this function is absolutely >> necessary, surely such convenience functions could live elsewhere >> rather than being in the central classes of the library. >> >> I blame IsHydrogen() - it's a magnet for further "Is"s :-) >> >> - Noel >> >> On 23 May 2016 at 19:06, Geoffrey Hutchison <geoff.hutchi...@gmail.com> >> wrote: >>>> http://baoilleach.webfactional.com/site_media/ob_api_check/compat_report_21052016.html >>>> It makes a few mistakes here and there but is accurate in general. >>> >>> It's a bit weird about adding optional parameters, e.g. >>> bool Build(OBMol &mol); >>> becomes >>> bool Build(OBMol &mol, bool stereoWarnings = true); >>> >>> This isn't an API issue, since a program build to the first will still >>> recompile. This is an ABI problem, but we've never been too concerned about >>> that from 2.x to 2.y. >>> >>>> I have a few comments to make regarding some of the changes, but will do >>>> that separately. >>> >>> I'm obviously interested in the feedback. It's also useful to make sure >>> that source documentation was added. >>> >>> Thanks, >>> -Geoff >> >> ------------------------------------------------------------------------------ >> What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic >> patterns at an interface-level. Reveals which users, apps, and protocols are >> consuming the most bandwidth. Provides multi-vendor support for NetFlow, >> J-Flow, sFlow and other flows. Make informed decisions using capacity >> planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e >> _______________________________________________ >> OpenBabel-Devel mailing list >> OpenBabel-Devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/openbabel-devel >> > -- David van der Spoel, Ph.D., Professor of Biology Dept. of Cell & Molec. Biol., Uppsala University. Box 596, 75124 Uppsala, Sweden. Phone: +46184714205. sp...@xray.bmc.uu.se http://folding.bmc.uu.se ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e _______________________________________________ OpenBabel-Devel mailing list OpenBabel-Devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openbabel-devel