Baseball player statistics controller











up vote
7
down vote

favorite
1












I'm somewhat new to JavaScript and AngularJS, and read in Doug Crockford's book that the hoisting function declaration can lead to issues. Any pointers on how to structure my file would be much appreciated.



(function() {
'use strict';

function PlayerProfileStatsCtrl($q, ColumnService, LookupService, PlayerService, PlayerStatsService) {
var vm = this;

var loadStats = function (player) {
$q.all({
catchingStats: PlayerStatsService.getCatchingStats(player.playerId),
fieldingStats: PlayerStatsService.getFieldingStats(player.playerId),
hittingStats: PlayerStatsService.getHittingStats(player.playerId),
pitchingStats: PlayerStatsService.getPitchingStats(player.playerId),
playerStats: LookupService.getByKeyPromise('lkplayerstat'),
statTypes: LookupService.getListPromise('lkstattype')
}).then(function (results) {

// Associate stat result lists with string keyed stat types.
vm.statResults = {
C: results.catchingStats.statList,
F: results.fieldingStats.statList,
H: results.hittingStats.statList,
P: results.pitchingStats.statList
};

// Assign the player stat lookup object.
vm.playerStats = results.playerStats;

// Assign the stat type lookup list.
vm.statTypes = results.statTypes;

initStatColumnDefs();
});
};

// Call loadStats() after the player promise is resolved.
vm.player = PlayerService.getPlayer(loadStats);

var initStatColumnDefs = function () {

// The column definitions are contained in lists and associated by stat type.
vm.statColumnDefs = {};

for (var i = 0; i < vm.statTypes.length; i++) {

// Get the current stat type key: { 'C', 'F', 'H', 'P' }
var statTypeKey = vm.statTypes[i].statTypeLk;

// Get the list of column names from the user.
var userSelectedStats = ColumnService.getColumns('STATS_' + statTypeKey);

var getStatColumnDefs = function (userColumns) {
var columnDefs = ;

// Each stat section will start with these columns.
columnDefs.push({ name: 'Season', fullName: 'Season', property: 'statDb.year' });
columnDefs.push({ name: 'Team', fullName: 'Team', property: 'team.teamName' });
columnDefs.push({ name: 'Level', fullName: 'Level', property: 'level.shortDescription' });

// Fielding has an additional column in before custom columns are displayed.
if (statTypeKey === 'F') {
columnDefs.push({ name: 'Pos', fullName: 'Position', property: 'statDb.positionLk' });
}

// Construct a custom stat column definition.
var getCustomColumnDef = function (userColumn) {
var currentStat = vm.playerStats[userColumn];
var displayName = currentStat.shortDescription;
var onHoverName = currentStat.description;
var statProperty = 'statDb.' + currentStat.statProperty;

// Format the custom stat according to the player stat lookup table.
var getFormattedStat = function (val) {
if (val === undefined) { // Return null if there is no value for that stat.
return;
} else {
if (!isNaN(val)) { // Only process numbers.
val = String(val.toFixed(currentStat.precision));

// Remove leading zero.
if (currentStat.leadingZeroFlg && val.startsWith('0')) {
val = val.substr(1, val.length-1);
}

// Add a % sign to the end of the stat.
if (currentStat.percentFlg) {
val += '%';
}
}
return val;
}
}
return { name: displayName, fullName: onHoverName, property: statProperty, format: getFormattedStat };
}

// Add a definition for each of the custom columns.
for (var i = 0; i < userColumns.length; i++) {
columnDefs.push(getCustomColumnDef(userColumns[i]));
}
return columnDefs;
}

// Store the list of defintions by stat type.
vm.statColumnDefs[statTypeKey] = getStatColumnDefs(userSelectedStats);

}
}
}

angular
.module('players')
.controller('PlayerProfileStatsCtrl', [ '$q', 'ColumnService', 'LookupService', 'PlayerService', 'PlayerStatsService', PlayerProfileStatsCtrl ])
})();









share|improve this question




















  • 3




    Note: Crockford says a lot of things. They are not all correct. Function hoisting is probably one of those times.
    – Dan Pantry
    Jun 28 '16 at 15:52












  • Do you still maintain this code? If so, could you provide context for the PlayerStatsService and LookupService, along with their methods?
    – Sᴀᴍ Onᴇᴌᴀ
    Jun 27 at 22:06










  • I do not anymore
    – Albert Orlando
    Sep 22 at 15:02















up vote
7
down vote

favorite
1












I'm somewhat new to JavaScript and AngularJS, and read in Doug Crockford's book that the hoisting function declaration can lead to issues. Any pointers on how to structure my file would be much appreciated.



(function() {
'use strict';

function PlayerProfileStatsCtrl($q, ColumnService, LookupService, PlayerService, PlayerStatsService) {
var vm = this;

var loadStats = function (player) {
$q.all({
catchingStats: PlayerStatsService.getCatchingStats(player.playerId),
fieldingStats: PlayerStatsService.getFieldingStats(player.playerId),
hittingStats: PlayerStatsService.getHittingStats(player.playerId),
pitchingStats: PlayerStatsService.getPitchingStats(player.playerId),
playerStats: LookupService.getByKeyPromise('lkplayerstat'),
statTypes: LookupService.getListPromise('lkstattype')
}).then(function (results) {

// Associate stat result lists with string keyed stat types.
vm.statResults = {
C: results.catchingStats.statList,
F: results.fieldingStats.statList,
H: results.hittingStats.statList,
P: results.pitchingStats.statList
};

// Assign the player stat lookup object.
vm.playerStats = results.playerStats;

// Assign the stat type lookup list.
vm.statTypes = results.statTypes;

initStatColumnDefs();
});
};

// Call loadStats() after the player promise is resolved.
vm.player = PlayerService.getPlayer(loadStats);

var initStatColumnDefs = function () {

// The column definitions are contained in lists and associated by stat type.
vm.statColumnDefs = {};

for (var i = 0; i < vm.statTypes.length; i++) {

// Get the current stat type key: { 'C', 'F', 'H', 'P' }
var statTypeKey = vm.statTypes[i].statTypeLk;

// Get the list of column names from the user.
var userSelectedStats = ColumnService.getColumns('STATS_' + statTypeKey);

var getStatColumnDefs = function (userColumns) {
var columnDefs = ;

// Each stat section will start with these columns.
columnDefs.push({ name: 'Season', fullName: 'Season', property: 'statDb.year' });
columnDefs.push({ name: 'Team', fullName: 'Team', property: 'team.teamName' });
columnDefs.push({ name: 'Level', fullName: 'Level', property: 'level.shortDescription' });

// Fielding has an additional column in before custom columns are displayed.
if (statTypeKey === 'F') {
columnDefs.push({ name: 'Pos', fullName: 'Position', property: 'statDb.positionLk' });
}

// Construct a custom stat column definition.
var getCustomColumnDef = function (userColumn) {
var currentStat = vm.playerStats[userColumn];
var displayName = currentStat.shortDescription;
var onHoverName = currentStat.description;
var statProperty = 'statDb.' + currentStat.statProperty;

// Format the custom stat according to the player stat lookup table.
var getFormattedStat = function (val) {
if (val === undefined) { // Return null if there is no value for that stat.
return;
} else {
if (!isNaN(val)) { // Only process numbers.
val = String(val.toFixed(currentStat.precision));

// Remove leading zero.
if (currentStat.leadingZeroFlg && val.startsWith('0')) {
val = val.substr(1, val.length-1);
}

// Add a % sign to the end of the stat.
if (currentStat.percentFlg) {
val += '%';
}
}
return val;
}
}
return { name: displayName, fullName: onHoverName, property: statProperty, format: getFormattedStat };
}

// Add a definition for each of the custom columns.
for (var i = 0; i < userColumns.length; i++) {
columnDefs.push(getCustomColumnDef(userColumns[i]));
}
return columnDefs;
}

// Store the list of defintions by stat type.
vm.statColumnDefs[statTypeKey] = getStatColumnDefs(userSelectedStats);

}
}
}

angular
.module('players')
.controller('PlayerProfileStatsCtrl', [ '$q', 'ColumnService', 'LookupService', 'PlayerService', 'PlayerStatsService', PlayerProfileStatsCtrl ])
})();









share|improve this question




















  • 3




    Note: Crockford says a lot of things. They are not all correct. Function hoisting is probably one of those times.
    – Dan Pantry
    Jun 28 '16 at 15:52












  • Do you still maintain this code? If so, could you provide context for the PlayerStatsService and LookupService, along with their methods?
    – Sᴀᴍ Onᴇᴌᴀ
    Jun 27 at 22:06










  • I do not anymore
    – Albert Orlando
    Sep 22 at 15:02













up vote
7
down vote

favorite
1









up vote
7
down vote

favorite
1






1





I'm somewhat new to JavaScript and AngularJS, and read in Doug Crockford's book that the hoisting function declaration can lead to issues. Any pointers on how to structure my file would be much appreciated.



(function() {
'use strict';

function PlayerProfileStatsCtrl($q, ColumnService, LookupService, PlayerService, PlayerStatsService) {
var vm = this;

var loadStats = function (player) {
$q.all({
catchingStats: PlayerStatsService.getCatchingStats(player.playerId),
fieldingStats: PlayerStatsService.getFieldingStats(player.playerId),
hittingStats: PlayerStatsService.getHittingStats(player.playerId),
pitchingStats: PlayerStatsService.getPitchingStats(player.playerId),
playerStats: LookupService.getByKeyPromise('lkplayerstat'),
statTypes: LookupService.getListPromise('lkstattype')
}).then(function (results) {

// Associate stat result lists with string keyed stat types.
vm.statResults = {
C: results.catchingStats.statList,
F: results.fieldingStats.statList,
H: results.hittingStats.statList,
P: results.pitchingStats.statList
};

// Assign the player stat lookup object.
vm.playerStats = results.playerStats;

// Assign the stat type lookup list.
vm.statTypes = results.statTypes;

initStatColumnDefs();
});
};

// Call loadStats() after the player promise is resolved.
vm.player = PlayerService.getPlayer(loadStats);

var initStatColumnDefs = function () {

// The column definitions are contained in lists and associated by stat type.
vm.statColumnDefs = {};

for (var i = 0; i < vm.statTypes.length; i++) {

// Get the current stat type key: { 'C', 'F', 'H', 'P' }
var statTypeKey = vm.statTypes[i].statTypeLk;

// Get the list of column names from the user.
var userSelectedStats = ColumnService.getColumns('STATS_' + statTypeKey);

var getStatColumnDefs = function (userColumns) {
var columnDefs = ;

// Each stat section will start with these columns.
columnDefs.push({ name: 'Season', fullName: 'Season', property: 'statDb.year' });
columnDefs.push({ name: 'Team', fullName: 'Team', property: 'team.teamName' });
columnDefs.push({ name: 'Level', fullName: 'Level', property: 'level.shortDescription' });

// Fielding has an additional column in before custom columns are displayed.
if (statTypeKey === 'F') {
columnDefs.push({ name: 'Pos', fullName: 'Position', property: 'statDb.positionLk' });
}

// Construct a custom stat column definition.
var getCustomColumnDef = function (userColumn) {
var currentStat = vm.playerStats[userColumn];
var displayName = currentStat.shortDescription;
var onHoverName = currentStat.description;
var statProperty = 'statDb.' + currentStat.statProperty;

// Format the custom stat according to the player stat lookup table.
var getFormattedStat = function (val) {
if (val === undefined) { // Return null if there is no value for that stat.
return;
} else {
if (!isNaN(val)) { // Only process numbers.
val = String(val.toFixed(currentStat.precision));

// Remove leading zero.
if (currentStat.leadingZeroFlg && val.startsWith('0')) {
val = val.substr(1, val.length-1);
}

// Add a % sign to the end of the stat.
if (currentStat.percentFlg) {
val += '%';
}
}
return val;
}
}
return { name: displayName, fullName: onHoverName, property: statProperty, format: getFormattedStat };
}

// Add a definition for each of the custom columns.
for (var i = 0; i < userColumns.length; i++) {
columnDefs.push(getCustomColumnDef(userColumns[i]));
}
return columnDefs;
}

// Store the list of defintions by stat type.
vm.statColumnDefs[statTypeKey] = getStatColumnDefs(userSelectedStats);

}
}
}

angular
.module('players')
.controller('PlayerProfileStatsCtrl', [ '$q', 'ColumnService', 'LookupService', 'PlayerService', 'PlayerStatsService', PlayerProfileStatsCtrl ])
})();









share|improve this question















I'm somewhat new to JavaScript and AngularJS, and read in Doug Crockford's book that the hoisting function declaration can lead to issues. Any pointers on how to structure my file would be much appreciated.



(function() {
'use strict';

function PlayerProfileStatsCtrl($q, ColumnService, LookupService, PlayerService, PlayerStatsService) {
var vm = this;

var loadStats = function (player) {
$q.all({
catchingStats: PlayerStatsService.getCatchingStats(player.playerId),
fieldingStats: PlayerStatsService.getFieldingStats(player.playerId),
hittingStats: PlayerStatsService.getHittingStats(player.playerId),
pitchingStats: PlayerStatsService.getPitchingStats(player.playerId),
playerStats: LookupService.getByKeyPromise('lkplayerstat'),
statTypes: LookupService.getListPromise('lkstattype')
}).then(function (results) {

// Associate stat result lists with string keyed stat types.
vm.statResults = {
C: results.catchingStats.statList,
F: results.fieldingStats.statList,
H: results.hittingStats.statList,
P: results.pitchingStats.statList
};

// Assign the player stat lookup object.
vm.playerStats = results.playerStats;

// Assign the stat type lookup list.
vm.statTypes = results.statTypes;

initStatColumnDefs();
});
};

// Call loadStats() after the player promise is resolved.
vm.player = PlayerService.getPlayer(loadStats);

var initStatColumnDefs = function () {

// The column definitions are contained in lists and associated by stat type.
vm.statColumnDefs = {};

for (var i = 0; i < vm.statTypes.length; i++) {

// Get the current stat type key: { 'C', 'F', 'H', 'P' }
var statTypeKey = vm.statTypes[i].statTypeLk;

// Get the list of column names from the user.
var userSelectedStats = ColumnService.getColumns('STATS_' + statTypeKey);

var getStatColumnDefs = function (userColumns) {
var columnDefs = ;

// Each stat section will start with these columns.
columnDefs.push({ name: 'Season', fullName: 'Season', property: 'statDb.year' });
columnDefs.push({ name: 'Team', fullName: 'Team', property: 'team.teamName' });
columnDefs.push({ name: 'Level', fullName: 'Level', property: 'level.shortDescription' });

// Fielding has an additional column in before custom columns are displayed.
if (statTypeKey === 'F') {
columnDefs.push({ name: 'Pos', fullName: 'Position', property: 'statDb.positionLk' });
}

// Construct a custom stat column definition.
var getCustomColumnDef = function (userColumn) {
var currentStat = vm.playerStats[userColumn];
var displayName = currentStat.shortDescription;
var onHoverName = currentStat.description;
var statProperty = 'statDb.' + currentStat.statProperty;

// Format the custom stat according to the player stat lookup table.
var getFormattedStat = function (val) {
if (val === undefined) { // Return null if there is no value for that stat.
return;
} else {
if (!isNaN(val)) { // Only process numbers.
val = String(val.toFixed(currentStat.precision));

// Remove leading zero.
if (currentStat.leadingZeroFlg && val.startsWith('0')) {
val = val.substr(1, val.length-1);
}

// Add a % sign to the end of the stat.
if (currentStat.percentFlg) {
val += '%';
}
}
return val;
}
}
return { name: displayName, fullName: onHoverName, property: statProperty, format: getFormattedStat };
}

// Add a definition for each of the custom columns.
for (var i = 0; i < userColumns.length; i++) {
columnDefs.push(getCustomColumnDef(userColumns[i]));
}
return columnDefs;
}

// Store the list of defintions by stat type.
vm.statColumnDefs[statTypeKey] = getStatColumnDefs(userSelectedStats);

}
}
}

angular
.module('players')
.controller('PlayerProfileStatsCtrl', [ '$q', 'ColumnService', 'LookupService', 'PlayerService', 'PlayerStatsService', PlayerProfileStatsCtrl ])
})();






javascript angular.js statistics promise controller






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 21 mins ago









Sᴀᴍ Onᴇᴌᴀ

8,12861751




8,12861751










asked Jun 28 '16 at 13:47









Albert Orlando

363




363








  • 3




    Note: Crockford says a lot of things. They are not all correct. Function hoisting is probably one of those times.
    – Dan Pantry
    Jun 28 '16 at 15:52












  • Do you still maintain this code? If so, could you provide context for the PlayerStatsService and LookupService, along with their methods?
    – Sᴀᴍ Onᴇᴌᴀ
    Jun 27 at 22:06










  • I do not anymore
    – Albert Orlando
    Sep 22 at 15:02














  • 3




    Note: Crockford says a lot of things. They are not all correct. Function hoisting is probably one of those times.
    – Dan Pantry
    Jun 28 '16 at 15:52












  • Do you still maintain this code? If so, could you provide context for the PlayerStatsService and LookupService, along with their methods?
    – Sᴀᴍ Onᴇᴌᴀ
    Jun 27 at 22:06










  • I do not anymore
    – Albert Orlando
    Sep 22 at 15:02








3




3




Note: Crockford says a lot of things. They are not all correct. Function hoisting is probably one of those times.
– Dan Pantry
Jun 28 '16 at 15:52






Note: Crockford says a lot of things. They are not all correct. Function hoisting is probably one of those times.
– Dan Pantry
Jun 28 '16 at 15:52














Do you still maintain this code? If so, could you provide context for the PlayerStatsService and LookupService, along with their methods?
– Sᴀᴍ Onᴇᴌᴀ
Jun 27 at 22:06




Do you still maintain this code? If so, could you provide context for the PlayerStatsService and LookupService, along with their methods?
– Sᴀᴍ Onᴇᴌᴀ
Jun 27 at 22:06












I do not anymore
– Albert Orlando
Sep 22 at 15:02




I do not anymore
– Albert Orlando
Sep 22 at 15:02










1 Answer
1






active

oldest

votes

















up vote
0
down vote













Bearing in mind that you claim not to maintain this code anymore1, there are a few suggestions I would have about this code:





  • define functions and accept parameters- that should allow the nested functions to be moved out... You may be able to utilize Partially applied functions.


  • catch rejected promises The code calls $q.all() with 6 promises, yet has no catch() callback! If any one of those promises would fail, should the user be notified?


  • bind function scope instead of assigning vm Utilize Function.prototype.bind() to set the context of this inside callback functions - like the promise callbacks, initStatColumnDefs(), etc. Then there is no need to define the extra variable vm - just use this.


  • Get rid of useless else - There is no need to use the else in the block cited below. If the conditional of the if statement evaluates to true then the return will be reached. Otherwise the rest of the code can be executed normally.




    if (val === undefined) {  // Return null if there is no value for that stat.
    return;
    } else {




1Baseball player statistics controller






share|improve this answer





















    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
    });
    });
    }, "mathjax-editing");

    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "196"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f133295%2fbaseball-player-statistics-controller%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote













    Bearing in mind that you claim not to maintain this code anymore1, there are a few suggestions I would have about this code:





    • define functions and accept parameters- that should allow the nested functions to be moved out... You may be able to utilize Partially applied functions.


    • catch rejected promises The code calls $q.all() with 6 promises, yet has no catch() callback! If any one of those promises would fail, should the user be notified?


    • bind function scope instead of assigning vm Utilize Function.prototype.bind() to set the context of this inside callback functions - like the promise callbacks, initStatColumnDefs(), etc. Then there is no need to define the extra variable vm - just use this.


    • Get rid of useless else - There is no need to use the else in the block cited below. If the conditional of the if statement evaluates to true then the return will be reached. Otherwise the rest of the code can be executed normally.




      if (val === undefined) {  // Return null if there is no value for that stat.
      return;
      } else {




    1Baseball player statistics controller






    share|improve this answer

























      up vote
      0
      down vote













      Bearing in mind that you claim not to maintain this code anymore1, there are a few suggestions I would have about this code:





      • define functions and accept parameters- that should allow the nested functions to be moved out... You may be able to utilize Partially applied functions.


      • catch rejected promises The code calls $q.all() with 6 promises, yet has no catch() callback! If any one of those promises would fail, should the user be notified?


      • bind function scope instead of assigning vm Utilize Function.prototype.bind() to set the context of this inside callback functions - like the promise callbacks, initStatColumnDefs(), etc. Then there is no need to define the extra variable vm - just use this.


      • Get rid of useless else - There is no need to use the else in the block cited below. If the conditional of the if statement evaluates to true then the return will be reached. Otherwise the rest of the code can be executed normally.




        if (val === undefined) {  // Return null if there is no value for that stat.
        return;
        } else {




      1Baseball player statistics controller






      share|improve this answer























        up vote
        0
        down vote










        up vote
        0
        down vote









        Bearing in mind that you claim not to maintain this code anymore1, there are a few suggestions I would have about this code:





        • define functions and accept parameters- that should allow the nested functions to be moved out... You may be able to utilize Partially applied functions.


        • catch rejected promises The code calls $q.all() with 6 promises, yet has no catch() callback! If any one of those promises would fail, should the user be notified?


        • bind function scope instead of assigning vm Utilize Function.prototype.bind() to set the context of this inside callback functions - like the promise callbacks, initStatColumnDefs(), etc. Then there is no need to define the extra variable vm - just use this.


        • Get rid of useless else - There is no need to use the else in the block cited below. If the conditional of the if statement evaluates to true then the return will be reached. Otherwise the rest of the code can be executed normally.




          if (val === undefined) {  // Return null if there is no value for that stat.
          return;
          } else {




        1Baseball player statistics controller






        share|improve this answer












        Bearing in mind that you claim not to maintain this code anymore1, there are a few suggestions I would have about this code:





        • define functions and accept parameters- that should allow the nested functions to be moved out... You may be able to utilize Partially applied functions.


        • catch rejected promises The code calls $q.all() with 6 promises, yet has no catch() callback! If any one of those promises would fail, should the user be notified?


        • bind function scope instead of assigning vm Utilize Function.prototype.bind() to set the context of this inside callback functions - like the promise callbacks, initStatColumnDefs(), etc. Then there is no need to define the extra variable vm - just use this.


        • Get rid of useless else - There is no need to use the else in the block cited below. If the conditional of the if statement evaluates to true then the return will be reached. Otherwise the rest of the code can be executed normally.




          if (val === undefined) {  // Return null if there is no value for that stat.
          return;
          } else {




        1Baseball player statistics controller







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 20 mins ago









        Sᴀᴍ Onᴇᴌᴀ

        8,12861751




        8,12861751






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Code Review Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f133295%2fbaseball-player-statistics-controller%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Costa Masnaga

            Fotorealismo

            Sidney Franklin