Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #35849

Re: double == double

From Patrick Roemer <sangamon@netcologne.de>
Newsgroups comp.lang.java.programmer
Subject Re: double == double
Date 2016-10-20 15:01 +0200
Organization news.netcologne.de
Message-ID <nuaf6r$eop$1@newsreader4.netcologne.de> (permalink)
References (14 earlier) <nu0g1b$vt5$2@gioia.aioe.org> <nu0qtc$eiu$1@dont-email.me> <nu1e88$9gn$1@gioia.aioe.org> <nu2vv1$ikt$1@newsreader4.netcologne.de> <nu97n6$fs1$1@gioia.aioe.org>

Show all headers | View raw


Responding to Arne Vajhøj:
> On 10/17/2016 12:58 PM, Patrick Roemer wrote:
>> Responding to Arne Vajhøj:
>>> On 10/16/2016 5:19 PM, 4ndre4 wrote:
>>>> On 16/10/2016 19:14, Arne Vajhøj wrote:
>>>>
>>>> [...]
>>>>> But that code is not using String as version
>>>>
>>>> Erm... how about this? :) I don't see how this is less OO-ish than the
>>>> previous one, but hey... okay!...:
>>>>
>>>>         List<String> versions = new ArrayList<String>();
>>>>
>>>>         versions.add("1.9.0-123");
>>>>         versions.add("1.10.0-123");
>>>>         versions.add("1.7.0-123");
>>>>         versions.add("1.7.0-123");
>>>>         versions.add("1.7.0-10");
>>>>         versions.add("1.7.0-9");
>>>>
>>>>         Collections.sort(versions, new VersionComparator());
>>>>
>>>> ...
>>>>
>>>> static class VersionComparator implements Comparator<String> {
>>>
>>>>         public int compare(String version1, String version2) {
>>>>             try {
>>>>                 ParsedVersion pv1 = parse(version1);
>>>>                 ParsedVersion pv2 = parse(version2);
>>>>                 if (pv1.equals(pv2)) return 0;
>>>>                 if (pv1.lessThan(pv2)) return -1;
>>>>                 return 1;
>>>>             } catch (InvalidVersionException e) {
>>>>                 throw new IllegalArgumentException(e);
>>>>             }
>>>>         }
>>>
>>> Having data and methods operating on the data separate is
>>> very non-OO'ish in my book.
>>
>> I don't think this describes the actual problem well. There may be
>> perfectly good, OO-compatible reasons to separate comparison logic from
>> the domain class - after all, that's why Comparator exists. For example,
>> there may be occasions when one wants to compare only based on the major
>> (major + minor,...) version parts.
> 
> The problem is not so much with the Comparator.
> 
> As you say then it is perfectly valid to have an external
> Comparator that matches the logic in the code doing the sort
> (or whatever).
> 
> The problem is with the parse code that is very much tied to the
> internal structure of the String.
> 
> Having that parse code in many different places will be a
> maintenance nightmare.
>
> And if the ParsedVersion and the parse code is made public
> and reused then we have the Version class back and there
> is little reason to use the String format except for
> input and output.

Agreed. But I wouldn't necessarily want to have the parse code in the
Version class, either. There may be different string formats from
different sources ("1.2.3.4" vs "1.2.3-004"), or there may even be other
representations than strings I want to convert from. Having just a plain
Version(int, int, int, int) constructor and offloading parsing to
dedicated classes might be a reasonable choice, and it'd still be in
line with OO principles. The main problem with the given code isn't
having methods and data separate, it's not having a Version type, and
that's not an OO specific problem.

>> But this code defies a more general programming principle: Describe your
>> concepts as dedicated types and define operations for those types.
>> Passing an opaque string around to be interpreted as a version only
>> "when needed" feels fishy to me in any paradigm.
> 
> That is very aligned with OOP.
> 
> But yes - you could do something sort of similar procedural even
> though it may start to be more like OOP in a non-OO language then.

In proper procedural, you'd have a Version record type and procedures
acting upon it. In proper functional you'd have a Version data type and
functions acting upon it. That's an overarching principle, nothing
specific to OO.

Here's a functional semantic version library, for example:

https://hackage.haskell.org/package/semver-0.3.3.1/docs/Data-SemVer.html

Using a String as a version representation would be as silly there as
anywhere else. And if you suggested to the Haskell guys that they were
emulating OO, they'd laugh you out of the room.

Best regards,
Patrick

Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

Re: double == double Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-12 09:39 -0400
  Re: double == double Michael Jung <miju@golem.phantasia.org> - 2016-10-13 21:10 +0200
    Re: double == double Michael Jung <miju@golem.phantasia.org> - 2016-10-15 14:04 +0200
      Re: double == double Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-15 09:13 -0400
        Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-15 10:32 -0400
          Re: double == double Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-15 10:46 -0400
            Re: double == double Michael Jung <miju@golem.phantasia.org> - 2016-10-15 17:44 +0200
            Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-15 17:36 +0100
              Re: double == double Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-15 14:15 -0400
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-15 19:41 +0100
            Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-15 20:39 -0400
      Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-15 10:41 -0400
        Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-15 23:09 +0100
          Re: double == double Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-15 18:28 -0400
            Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 03:13 +0100
              Re: double == double Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-16 08:37 -0400
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 14:06 +0100
          Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-15 20:30 -0400
            Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 03:16 +0100
              Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 03:18 +0100
              Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-16 09:45 -0400
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 14:51 +0100
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-16 11:24 -0400
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 16:43 +0100
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-16 12:54 -0400
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 18:37 +0100
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-16 14:14 -0400
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-16 22:19 +0100
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-16 22:49 -0400
                Re: double == double a.laforgia@gmail.com - 2016-10-17 01:53 -0700
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-17 19:04 +0200
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-17 20:17 +0100
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-17 23:11 +0200
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-17 22:46 +0100
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-18 18:55 +0200
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-18 18:52 +0100
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-20 15:03 +0200
                True O-O [Was: double == double] Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-10-17 18:06 -0400
                Re: True O-O Patrick Roemer <sangamon@netcologne.de> - 2016-10-18 18:32 +0200
                Re: True O-O [Was: double == double] Arne Vajhøj <arne@vajhoej.dk> - 2016-10-19 22:09 -0400
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-19 21:58 -0400
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-17 18:58 +0200
                Re: double == double 4ndre4 <626401fd-4bc7-4f8f-b641-563ae0f72920@626401fd-4bc7-4f8f-b641-563ae0f72920.invalid> - 2016-10-17 20:32 +0100
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-17 23:21 +0200
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-19 21:38 -0400
                Re: double == double Arne Vajhøj <arne@vajhoej.dk> - 2016-10-19 21:47 -0400
                Re: double == double Patrick Roemer <sangamon@netcologne.de> - 2016-10-20 15:01 +0200

csiph-web