Hi Justin,

Appreciate the efforts you making in getting things done. As a person who likes 
feedback myself I have put together a few comments, please accept these as 
feedback rather than criticism, I certainly don't want you to think your 
efforts are not appreciated.

Unfortunately I have only had time to look at one function in one class,

hth

dan




PostcodeValidator.validatePostcode(...)

--




In general, seems to be a few literal strings which could be converted to 
constants, e.g.:

private static const FORMAT_CHAR_NUMBER:String = "N";
private static const FORMAT_CHAR_LETTER:String = "A";
private static const FORMAT_CHAR_COUNTRY_CODE:String = "C";

public static const: ERROR_CODE_WRONG_FORMAT:String = "wrongFormat";

etc


Line 107:

107 var noformats:int;

> Ambiguous variable name; does it mean 'number of formats' or 'no formats', if 
> number of formats, suggest rename to 'numberOfFormats'

---------------

Line 129:

129    if (postCode) {
130     length = postCode.length;
131     }


> Why make this check here, from what I can see, the value of postCode does not 
> change within the loop, so why not make the check and assignment prior to the 
> loop and avoid multiple checks ?

> I note also, that this condition would never occur when called by 
> doValidation(), but accept it could happen if called by something else.




Line 122:

for (var f:int = 

> this seems a strange variable name; I would suggest either sticking to i, j, 
> etc or if using a more meaningful name like 'formatIndex' or something like 
> that.


Line 138:


138     // ignore character past end of format string
139     if (i >= formatLength) {
140     break;
141     }


> Could this condition not be determined before getting to the start of the 
> loop (inner loop) and then the i < length be a value dependent on i >= 
> formatLength ; I don't see any code which changes the formatLength once 
> inside the loop ? I see you are doing some kind of check anyway down on line 
> 169, maybe this could be brought higher and used to determine the length 
> variable in the loop ? Also if you are into the "clean code" approach by Bob 
> Martin, then this comment is probably an indication that you need to 
> refractor to more meaningful code, e.g.

if(reachedEndOfFormatString(position, formatLength))
{
 break;
}

or if that feels like overkill:

if( characterPosition >= formatLength)
{
    ...


Line 143:

DECIMAL_DIGITS.indexOf(char) == -1

Suggest you could create functions which do checks like this and give them a 
more meaningful name, this way, if you change the implementation you only have 
to change it in one place, for example put DECIMAL_DIGITS.indexOf(char) == -1 
inside of a function called noDecimalDigitsIn, then your code reads more 
meaningful to those scanning through:

if( noDecimalDigitsIn(char) && noRomanDigitsInChar(char) && 
noSpacersInChar(char)
{
 etc

private function noDecimalDigitsInChar(char:String):Boolean
{
    return DECIMAL_DIGITS.indexOf(char) == -1;
}


Line 158:

countryDigit

> It took me a while to work out what you are doing here and then I realised (I 
> think) you are counting the amount of times a country digit is found ? Maybe 
> call the variable 'amountOfCountryDigitsFound'  or 'countryDigitsLength' ?



Line 133 to 167  (inner loop)

for (var i:int = 0; i < length; i++)


Maybe all the code inside this loop could be extracted to a function, that way, 
when I look at the validatePostcode function, I can see the big picture in less 
lines and then if I care about what is going on inside the 'validating 
characters' loop, I can go look in that function.



Line 192 to 218  could be put all of this into a function named something like 
processResults(..) ? That way, when reading validatePostcode function we can 
ignore that code unless/until we care about it ?


combining the above two suggestions I can then glance at the validatingPostcode 
function and see quite quickly that it:

for each format
    validates each character in the postcode
    holds the error
converts the errors to results



Line 198 to 216  


There seems to be the opportunity to reduce the code here, as its seems to be 3 
very similar blocks of code, could you extract this somewhere else and pass in 
the differences ? For example:

public static const: ERROR_CODE_INVALID_CHAR:String = "invalidChar";
public static const: ERROR_CODE_WRONG_LENGTH:String = "wrongLength";
public static const: ERROR_CODE_WRONG_FORMAT:String = "wrongFormat";


----


var error:Object = getPreferredError();


addValidationErrorToResults(error.invalidChar, ERROR_CODE_INVALID_CHAR, 
validator.invalidCharError);
addValidationErrorToResults(error.wrongLength, ERROR_CODE_WRONG_LENGTH, 
validator.wrongLengthError);
addValidationErrorToResults(error.invalidFormat, ERROR_CODE_WRONG_FORMAT, 
validator.wrongFormatError);

----



private function getPreferredError():Object
{
    errors.sortOn(ERROR_COUNT_FIELD, Array.NUMERIC);
    return errors[0];
}


private function addValidationErrorToResults(shouldProcessField:Boolean, 
errorCode:String, errorMessage:String):ValidationResult
{
    results.push(new ValidationError(true, basefield, errorCode, errorMessage));
}



--
note: not that important, but also noticed a very minor inconsistency in the 
naming convention of the error type vs the errorCode and errorMessage:

.invalidFormat, "wrongFormat", .wrongFormatError

wrongLength and invalidChar use wrong and invalid for all variables, whilst 
format uses invalid for one and wrong for other two






________________________________
 From: Justin Mclean <jus...@classsoftware.com>
To: flex-dev@incubator.apache.org 
Sent: Thursday, 8 March 2012, 3:07
Subject: [Proposal] Add PostCodeValidator and PostCodeFormatter to the SDK
 
Hi,

This PostCodeValidator and PostCodeFormatter components are are at stage where 
they could be considered for inclusion into the SDK. 

The components, tests and example application can be found here:
http://svn.apache.org/viewvc/incubator/flex/whiteboard/jmclean/validators/src/

There's a few minor issues to sort out such as what name space should they live 
under and probably some minor code layout issues. (And I would certainly like 
at least one person to do a solid review of the code.)

They are well unit tested see PostCodeValidatorTests and PostCodeFormatterTests 
for tests.

There is a example application be viewed online here:
http://cdn.classsoftware.com/apacheflex/postcodes/PostCodeValidationExample.html

I'd welcome any feedback people have.

Thanks,
Justin

Reply via email to