-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
code review #30
Comments
@pixelzoom I am going to have @zepumph tackle this one with support from @jessegreenberg if needed. He has now done reviews of some simpler sims like RIAW and Ohm's Law so this will be a good learning experience for him. Marking as medium priority since @zepumph has a fair number of things going on. Since we are wanting to publish this sim, it would be good to get out by the end of the summer, so lets plan on finishing up code review by July 21. Let me know if we see any issues with that tentative timeline. |
Please mark failed items with ❌ PhET code-review checklistBuild and Run Checks
Internationalization
Repository structure
my-repo/
assets/
audio/
license.json
doc/
model.md
implementation-notes.md
images/
license.json
js/
(see section below)
dependencies.json
.gitignore
my-repo_en.html
my-repo-strings_en.json
Gruntfile.js
LICENSE
package.json
README.md For a common-code repository, the structure is similar, but some of the files and directories may not be present if the repo doesn’t have audio, images, strings, or a demo application.
my-repo/
js/
common/
model/
view/
introduction/
model/
view/
lab/
model/
view/
my-repo-config.js
my-repo-main.js
myRepo.js
Coding Conventions
var numPart // incorrect
var numberOfParticles // correct
var width // incorrect
var beakerWidth // correct
// modules
var inherit = require( 'PHET_CORE/inherit' );
var Rectangle = require( 'SCENERY/nodes/Rectangle' );
var Line = require( 'SCENERY/nodes/Line' );
// strings
var kineticString = require( 'string!ENERGY/energy.kinetic' );
var potentialString = require( 'string!ENERGY/energy.potential' );
var thermalString = require( 'string!ENERGY/energy.thermal' );
// images
var energyImage = require( 'image!ENERGY/energy.png' );
// audio
var kineticAudio = require( 'audio!ENERGY/energy' );
For example, this constructor uses parameters for everything. At the call site, the semantics of the arguments are difficult to determine without consulting the constructor. /**
* @param {Ball} ball - model element
* @param {Property.<boolean>} visibleProperty - is the ball visible?
* @param {Color|string} fill - fill color
* @param {Color|string} stroke - stroke color
* @param {number} lineWidth - width of the stroke
* @constructor
*/
function BallNode( ball, visibleProperty, fill, stroke, lineWidth ){
...
}
// Call site
var ballNode = new BallNode( ball, visibleProperty, 'blue', 'black', 2 ); Here’s the same constructor with an appropriate use of options. The call site is easier to read, and the order of options is flexible. /**
* @param {Ball} ball - model element
* @param {Property.<boolean>} visibleProperty - is the ball visible?
* @param {Object} [options]
* @constructor
*/
function BallNode( ball, visibleProperty, options ) {
options = _.extend( {
fill: 'white', // {Color|string} fill color
stroke: 'black', // {Color|string} stroke color
lineWidth: 1 // {number} width of the stroke
}, options );
// ...
}
// Call site
var ballNode = new BallNode( ball, visibleProperty, {
fill: 'blue',
stroke: 'black',
lineWidth: 2
} );
/**
* The PhetDeveloper is responsible for creating code for simulations
* and documenting their code thoroughly.
*
* @param {string} name - full name
* @param {number} age - age, in years
* @param {boolean} isEmployee - whether this developer is an employee of CU
* @param {function} callback - called immediate after coffee is consumed
* @param {Property.<number>} hoursProperty - cumulative hours worked
* @param {string[]} friendNames - names of friends
* @param {Object} [options] - optional configuration, see constructor
* @constructor
*/
function PhetDeveloper( name, age, isEmployee, callback, hoursProperty, friendNames, options ) {}
var self = this;
someProperty.link( function(){
self.doSomething();
} );
this.doSomethingElse();
return inherit( Object, Line, {
/**
* Gets the slope of the line
* @returns {number}
*/
getSlope: function() {
if ( this.undefinedSlope() ) {
return Number.NaN;
}
else {
return this.rise / this.run;
}
},
/**
* Given x, solve y = m(x - x1) + y1. Returns NaN if the solution is not unique, or there is no solution (x can't
* possibly be on the line.) This occurs when we have a vertical line, with no run.
* @param {number} x - the x coordinate
* @returns {number} the solution
*/
solveY: function( x ) {
if ( this.undefinedSlope() ) {
return Number.NaN;
}
else {
return ( this.getSlope() * ( x - this.x1 ) ) + this.y1;
}
}
} );
// avoid
self[ isFaceSmile ? 'smile' : 'frown' ]();
// OK
isFaceSmile ? self.smile() : self.frown();
// OK
if ( isFaceSmile ) {
self.smile();
}
else {
self.frown();
}
( expression ) && statement;
( expression ) ? statement1 : statement2;
( foo && bar ) ? fooBar() : fooCat();
( foo && bar ) && fooBar();
( foo && !(bar && fooBar)) && nowIAmConfused();
this.fill = ( foo && bar ) ? 'red' : 'blue'; If the expression is only one item, the parentheses can be omitted. This is the most common use case. assert && assert( happy, ‘Why aren\’t you happy?’ );
happy && smile();
var thoughts = happy ? ‘I am happy’ : ‘I am not happy :(’;
// Randomly choose an existing crystal to possibly bond to
var crystal = this.crystals.get( _.random( this.crystals.length - 1 ) );
// Find a good configuration to have the particles move toward
var targetConfiguration = this.getTargetConfiguration( crystal );
For JSDoc-style comments, the annotation should appear in context like this: /**
* Creates the icon for the "Energy" screen, a cartoonish bar graph.
* @returns {Node}
* @public
*/ For Line comments, the annotation can appear like this: // @public Adds a {function} listener
addListener: function( listener ) { /*...*/ } Math Libraries
Organization, Readability, Maintainability
Performance, Usability
Memory Leaks
PhET-iO
|
Memory testing #33 has been completed. No changes to sim code were required. |
Everything except the hyperlink on the real molecules page, which I think is desirable. Correct me if I am wrong. |
@zepumph I noticed that you marked this item with as failing:
This sim has 2 images and (for both of them) images/license.json indicates:
So there is no assets/ directory because there are no images that were produced from a .ai file. The checklist should probably be modified to be a little clearer on this point. |
I've never seen that pattern before (using the screenshot as the source of an image file), but that sounds good to me. Would you mind updating the checklist? |
@zepumph Some things that I neglected to mention, but which you may have already figured out... We decided to publish this sim without completing the "Real Molecules" screen, see #27. The implementation of that screen is complete, with the exception of the 3D molecule viewer. And I recommend reviewing the code for that screen. To see that screen in it's partially-completed state, run with You can ignore JSmolViewerNode.js. As indicated in the TODO comment, we're keeping it around until the 3D molecule viewer has been implemented. Sorry for not mentioning this in an earlier comment. |
I just finished going through the first screen completely. As expected, things are going smoothly. There isn't much to change, more for me to ask about and learn from. Thanks for bearing with me @pixelzoom. @ariel-phet I'm not sure if I will be done by the end of the week, but that is the goal, and I'll keep you posted as we get closer. |
@zepumph that was a target, but it is OK if it takes longer. And yes, a big point of this code review was we figured the sim was likely in pretty good shape and it would mostly be a learning experience for you and a chance to ask questions/dig deeper. |
@zepumph said:
Au contraire, you've suggested some good changes. This sim was feature complete in March 2014, and there's been much progress since then, so there was definitely room for improvement here and there. |
The |
Code review completed @pixelzoom, thanks for all the good work and help you gave me during the process. Back to you. |
Thanks for the thorough review @zepumph. All related issues are closed, so closing this issue. |
Thank you! |
Since this sim will be published without the Real Molecules screen (see #27), we can move forward with code review.
@ariel-phet please prioritize and assign.
I'd like to make one more pass through the code. So whoever is assigned, please wait for the go-ahead from me.
The text was updated successfully, but these errors were encountered: