Review of std.net.isemail part 2

Jacob Carlborg doob at me.com
Sat Apr 2 09:26:34 PDT 2011


On 2011-04-01 11:01, Jonathan M Davis wrote:
> On 2011-03-29 14:06, Jacob Carlborg wrote:
>> I've made a few minor changes:
>>
>> * Renamed EmailStatusCode.Off ->  None and On ->  Any
>> * Added and clarified the documentation for EmailStatusCode.Any and None
>> * Updated the documentation
>>
>> Github: https://github.com/jacob-carlborg/phobos/tree/isemail
>> Docs: http://dl.dropbox.com/u/18386187/isemail.html
>
> Shouldn't isEmail have a template constraint which verifies that the e-mail
> variable is a valid string type? Also, it would probably be better to use Char
> instead of T for the type. It's clearer that way. I believe that that's what
> std.string does.

That's a good idea.

> I'd strongly consider making EmailStatus' public member variables private with
> getter properties (no setters obviously, since they're const), since you can't
> even assign to a const struct, and that could be annoying. For instance, you
> can't really put them in an array very well. By making them only have getter
> properties, you get the same effect but can still put the struct in arrays or
> reassign it if you need to. const member variables in classes isn't such a big
> deal, but I'm disinclined to use them in structs due to the issues that they
> cause.

Ok, didn't think about that.

> I'd be inclined to make EmailStatus' constructor private. I'm not sure that it
> makes any sense for it to be public. Why would anyone create one rather than
> using isEmail to create it?

I guess you're right.

> You should probably add a note to the documentation that the DNS check hasn't
> been implemented yet.

Yes.

> It would probably be a good idea to create a free function which takes an
> EmailStatusCode and returns the status string, move the logic in the status
> function to there, and have it call the new function. That way, if a program
> needed to know what the actual string was without having an e-mail with that
> particular error, it could get at the string.

Is this really necessary? Would you ever have the status code without 
the EmailStatus?

> If you're going to mention a version number, you might want to make it clearer
> what the code is based on, since from Phobos' perspective, the version number
> makes no sense. It _does_ make sense to say that it's based on version X of
> library Y but not that the module itself is version X - especially when that
> version is 3+, and it's brand-new.

Yeah, I kind of most of that text as is.

> Nitpicks:
>
> You have tabs and trailing space in the file. You shouldn't have either. And
> even if we wanted tabs, they were used inconsistently.

Forgot about converting the tabs to spaces? How can I easily find 
trailing spaces?

> Why did you create aliases for front, back, and popFront? That's a really odd
> thing to do and makes the code harder to understand. I would have considered
> that to fall in the "useless alias" category and best to be avoided.

I like those names better and though it wouldn't matter all the much 
since they're private.

> As stated before, all of your enums seem to start with a capital letter when
> the typical thing to do in Phobos at this point is to start with a lowercase
> letter.

Yes, didn't know what the naming convention were for enum members when I 
started.

> It would be nice if isEmail were broken up given its size, but it does seem
> like the sort of function which wouldn't break up very easily. The most
> obvious way to do that would be to create separate functions for each case
> statement, but given all of the variables involved, that wouldn't work very
> well. About the only sane way that I could think of doing that would be to
> create class or struct which held all of the logic and had all of those local
> variables as member variables. Then each of the cases could be broken up into
> separate functions. It would probably be declared internal to isEmail, and
> isEmail would construct one and then get the result out of it. That would
> allow you to break up the function. However, I'm not at all convinced that
> that would really be a better solution. It does seem a bit convoluted to do
> that just to break the function up. If it really helped the function's
> readability and maintainability then it would be worth it, but it might make
> it worse. So, I don't really like the size of the function, and that's a way
> that you could break it up, but unless you really think that that's a good
> idea, I'd just leave it as is. It's the sort of function that's generally
> stuck being long.

I agree with you, it's far too big but I don't know how I could break it 
up. It would be a lot easier if I've written the function myself but 
it's just a port of a PHP function.

> Overall, it looks pretty good. And as long as it works, it should be fine
> other than the few API issues that I mentioned, and they're not exactly
> enormous issues.

Thanks.

> - Jonathan M Davis


-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list