Función de constructor JavaScript "Randomnumbers" -- javascript campo con object-oriented campo con random camp codereview Relacionados El problema

JavaScript constructor function “RandomNumbers”


4
vote

problema

Español

Mi idea es tener objetos que contengan números aleatorios. Los números aleatorios se mantienen en alguna estructura de datos (dentro de los objetos). Además, los objetos deberán tener métodos para trabajar con los números aleatorios.

  A5  

Antes de continuar con agregar más métodos (como, por ejemplo, "Shuffle"), agradecería su revisión. Especialmente en relación con:

  • ¿Está mi validación de parámetros realizada correctamente y suficiente?

  • Diseño: He agregado el método "ValidatNUEGN" a la función del constructor en sí mismo como un método estático. "Consolíganseado", he hecho un método de objeto porque no tendría ningún sentido sin tener un objeto (con números aleatorios).

¿Son estas decisiones correctas? ¿O hay buenas razones para cambiarlo de alguna manera?

Todos los demás consejos y comentarios sobre cómo mejorar la función también se aprecian.

Original en ingles

My idea is to have objects which contain random numbers. The random numbers are keeped in some data structure (within the objects). Furthermore the objects shall have methods for working with the random numbers.

var oo = oo || {}; // 'oo' serves as a namespace. Have choosen these chars just because they are easy to type.  oo.randomNumbers;  oo.alignedTextCreator;  oo.RandomNumbers =    function(quantityRandomNumbers, inclusiveMin, exclusiveMax) {   // ------- Validations --------------------------------------   if (inclusiveMin >= exclusiveMax) {     throw new Error('exclusiveMax have to larger then inclusiveMax.');   }    if (!oo.RandomNumbers.validateNumber(quantityRandomNumbers, 1, 10000)) {     throw new Error(       'Assigned parameter quantityRandomNumbers is not valid.');   }    if (!oo.RandomNumbers.validateNumber(inclusiveMin, 0, 100000)) {     throw new Error('Assigned parameter inclusiveMin is not valid.');   }    if (!oo.RandomNumbers.validateNumber(exclusiveMax, 0, 100000)) {     throw new Error('Assigned parameter exclusiveMin is not valid.');   }      // ------- Property declarations --------------------------------   this.randomNumbers = [];   this.min = exclusiveMax - 1; // Using the min-, max-search algorithm.   this.max = inclusiveMin;      // ------- Methods ----------------------------------------------      // Can be used to print a CSS-styled number (from within the    //  randomNumbers-array) to the screen.   this.consoleLogNumberStyled = function(text, color, val, fontFamily) {     text        = text || '%c%s';     color       = color || 'black';     fontFamily  = fontFamily || 'courier';      console.log(text,                 'color: ' + color + '; font-family: ' + fontFamily + ';',                 val );   }   // -----------------------------------------------------------      // Create random numbers and push them to the array.    //  Keep record about the smallest and largest number.   for (var i= 0; i < quantityRandomNumbers; i++) {     this.randomNumbers.push(       Math.floor(Math.random() * (exclusiveMax - inclusiveMin))        + inclusiveMin);      if (this.randomNumbers[i] < this.min) {       this.min = this.randomNumbers[i];     }      if (this.randomNumbers[i] > this.max) {       this.max = this.randomNumbers[i];     }    } }  // Static method. Used the RandomNumbers function self to validate the //  given parameter. oo.RandomNumbers.validateNumber = function(numberToValidate, minLength, maxLength) {   minLength = minLength || 0;   maxLength = maxLength || 1000000;    if (typeof numberToValidate != 'number' || numberToValidate === NaN      || numberToValidate < minLength || numberToValidate > maxLength) {     return false;   } else {     return true;   } }  // For accomplishing an aligned output on the console. oo.AlignedTextCreator = function(columnWidthNeeded) {   if (!oo.RandomNumbers.validateNumber(columnWidthNeeded, 1, 10000)) {     throw new Error(       'Assigned parameter columnWidthNeeded is not valid.');   }    this.columnWidthNeeded = new Array(columnWidthNeeded).join(' ');    this.createAlignedText = function(i, text) {     return (this.columnWidthNeeded + i).slice(-this.columnWidthNeeded.length)       + ' : ' + text;   } }  // -- Create & use a RandomNumbers object. -------------------------------------------- oo.randomNumbers = new oo.RandomNumbers(1000, 10, 100000); oo.alignedTextCreator = new oo.AlignedTextCreator((oo.quantityRandomNumbers + '').length); // Print every number within the set to the console. for (oo.i = 0; oo.i < 1000; oo.i++) {   console.log(      oo.alignedTextCreator       .createAlignedText(oo.i,                          oo.randomNumbers.randomNumbers[oo.i])   ); } // Print min and max of the created set to the console. oo.randomNumbers.consoleLogNumberStyled(   'Min: %c%s',   'magenta',   oo.randomNumbers.min); oo.randomNumbers.consoleLogNumberStyled(   'Max: %c%s',   'green',   oo.randomNumbers.max);

Before I go on with adding more methods (like for example "shuffle") I would appreciate your review. Especially concerning:

  • Is my parameter validation done correctly and sufficient?

  • Design: I have added the "validateNumber" method to the constructor function itself as a static method. "consoleLogNumberStyled" I have made an object method because it would make no sense without having an object (with random numbers).

Are these decisions correct? Or are there good reason for changing it somehow?

All other hints and comments how to improve the function are appreciated too.

        
     
     

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

naming:

en lugar de

  oo.RandomNumbers = function(quantityRandomNumbers, inclusiveMin, exclusiveMax) { ... }   

Comentarios de suministro para documentar su código y simplificar a

  // Creates random numbers from min (inclusive) to max (exclusive): oo.RandomNumbers = function(length, min, max) { ... }   

Es posible que desee seguir un formato establecido, como jsdoc .

en lugar de

  this.min = exclusiveMax - 1; this.max = inclusiveMin;   

Elija más nombre descriptivo para evitar mezclas, por ejemplo.

  this.lowest = exclusiveMax - 1; this.highest = inclusiveMin;   

también,

  oo.randomNumbers.randomNumbers[oo.i]   

es una duplicación. Ir con algo más sencillo como

  ppd0  

Manipulación de errores:

en lugar de lanzar un 99887766655443311 para

  ppd2  

Lanza un 99887766555443313 .

deshacerse de todo tipo de validaciones de entrada arbitrarias como

  ppd4  

y simplemente escriba un código robusto que maneja todos los ppd5 Entradas de manera consistente:

  • La longitud máxima de la matriz es 2³² - 1 y todo lo anterior ya causa un lanzamiento de 99887776655443316

  • El límite inferior y superior para MIN y MAX podría configurarse más sensiblemente en ppd7 y ppd8 o 99887776655443319 y < > cRep020 o simplemente cRep1 y cRep2 . Deje que el usuario de su módulo haya elegido qué límites sean relevantes en lugar de elegir arbitrariamente cRep3 y cRep4 .

  • cRep55555443325 Los valores se manejan de manera robusta y consistente: si el mínimo o el máximo es 99887776655443326 , toda la salida será `nan', también.

Preocupaciones separadas:

  cRep7  

No pertenece al mismo espacio de nombres o módulo que el generador numérico aleatorio, ya que no están relacionados en absoluto.

espacio de nombres:

Usted utiliza el objeto cRep8 para cosas no relacionadas:

  1. Actuar como un módulo que mantiene sus funciones de métodos y constructores
  2. actuar como un alcance de bloque y, por lo tanto, le impedirle contaminar el alcance global

Solo enfócate en 1. Y para 2. Use una IIIA o un simple alcance de bloqueo .

también, en lugar de

  cRep9  

Utilice una variable local a través de void Traversal::BadStatus( std::ostringstream& ppd, const string& msg ) { ppd << endl << msg; cRep = ppd.str(); cSuc = false; } 0 o aún más localizado a través de void Traversal::BadStatus( std::ostringstream& ppd, const string& msg ) { ppd << endl << msg; cRep = ppd.str(); cSuc = false; } 1

  void Traversal::BadStatus( std::ostringstream& ppd, const string& msg ) {   ppd << endl << msg;   cRep = ppd.str();   cSuc = false; } 2  

complejidad general:

En lugar de introducir una nueva clase para algo tan simple como una matriz de números aleatorios, escriba funciones de ayuda reutilizables simples que devuelven las matrices:

  void Traversal::BadStatus( std::ostringstream& ppd, const string& msg ) {   ppd << endl << msg;   cRep = ppd.str();   cSuc = false; } 3  
 

Naming:

Instead of

oo.RandomNumbers = function(quantityRandomNumbers, inclusiveMin, exclusiveMax) { ... } 

supply comments to document your code and simplify to

// Creates random numbers from min (inclusive) to max (exclusive): oo.RandomNumbers = function(length, min, max) { ... } 

You might want to follow an established format such as JSDoc.

Instead of

this.min = exclusiveMax - 1; this.max = inclusiveMin; 

chose more descriptive name to avoid mix-ups, e.g.

this.lowest = exclusiveMax - 1; this.highest = inclusiveMin; 

Also,

oo.randomNumbers.randomNumbers[oo.i] 

is a duplication. Go with something simpler such as

oo.randomNumbers.values[oo.i] 

Error handling:

Instead of throwing a generic Error for

if (inclusiveMin >= exclusiveMax) {   throw new Error('exclusiveMax have to larger then inclusiveMax.'); } 

throw a more specific RangeError.

Get rid of all kinds of arbitrary input validations such as

if (!oo.RandomNumbers.validateNumber(quantityRandomNumbers, 1, 10000)) {   throw new Error(     'Assigned parameter quantityRandomNumbers is not valid.'); }  if (!oo.RandomNumbers.validateNumber(inclusiveMin, 0, 100000)) {   throw new Error('Assigned parameter inclusiveMin is not valid.'); }  if (!oo.RandomNumbers.validateNumber(exclusiveMax, 0, 100000)) {   throw new Error('Assigned parameter exclusiveMin is not valid.'); } 

and simply write robust code that handles all Number inputs in a consistent manner:

  • The maximum array length is 2xc2xb3xc2xb2 - 1 and everything above that already causes a RangeError to be thrown.

  • The lower and upper limit for min and max could more sensibly be set to Number.MIN_SAFE_INTEGER and Number.MAX_SAFE_INTEGER or Number.MIN_VALUE and Number.MAX_VALUE or simply -Infinity and Infinity. Let the user of your module chose which limits are relevant instead of arbitrarily choosing 0 and 100000.

  • NaN values are handled in a robust and consistent manner already: if either the minimum or maximum is NaN, the whole output will be `NaNxc2xb4, too.

Separate concerns:

oo.consoleLogNumberStyled() oo.AlignedTextCreator() 

don't belong on the same namespace or module as the random number generator as they are not related at all.

Namespace:

You use the oo object for unrelated things:

  1. to act as a module holding your methods and constructor functions
  2. to act as a block scope and thus prevent you from polluting the global scope

Just focus on 1. and for 2. use either an IIFE or a simple block scope.

Also, instead of

for (oo.i = 0; oo.i < 1000; oo.i++) { ...  } 

use a local variable via var or even more localized via let

for (let i = 0; i < 1000; i++) { ... } 

Overall complexity:

Instead of introducing a new class for something as simple as a random number array, write simple reusable helper functions which return arrays:

// Random number between min (inclusive) and max (exclusive): function randomInteger(min, max) {   if (min >= max) throw new RangeError("max must be larger than min");   return Math.floor(Math.random() * (max - min)) + min; }  // Array of 'length' random numbers between min (inclusive) and max (exclusive): function randomIntegers(length, min, max) {   return Array.from({length: length}, () => randomInteger(min, max)); }  let integers = randomIntegers(10, 0, 5); let min = Math.min(...integers); let max = Math.max(...integers);  console.log(integers, min, max);
 
 

Relacionados problema

4  Simple WinForm que aleatoriza imágenes en una caja de fotos  ( Simple winform that randomizes images in a picturebox ) 
Escribí este código para una aplicación simple que nos da imágenes aleatorias. El código funciona, pero siento que estoy haciendo algo mal. Y una cosa que me ...

4  Tarea de lotería virtual  ( Virtual lotto task ) 
Tuve la tarea de escribir un simulador de lotería. Mi programa funciona de la siguiente manera: Para comenzar, el usuario puede escribir en 6 números. Lu...

4  Agregar una entrada duplicada al azar a una lista en Haskell usando Mónad aleatorio  ( Adding a duplicate entry randomly into a list in haskell using random monad ) 
Hay una nueva versión de esto como V2 - Agregar una entrada duplicada al azar a una lista en Haskell usando Monad Random Escribí esto tratando de configur...

4  Plantilla de C ++ para elegir aleatoriamente de N Elementos con distribución uniforme  ( C template to randomly choose from n elements with uniform distribution ) 
Hay un bonito algoritmo para elegir al azar un elemento de una lista en una sola pasada: Pase a través de la lista Manteniendo el elemento elegido hasta aho...

3  Generador de horario aleatorio  ( Random schedule generator ) 
En un intento de probar algo nuevo, y posiblemente ayudar en el trabajo, intenté crear un generador de programación aleatorio que genera horarios basados ​​en...

5  Selector y reproductor de MP3 aleatorio  ( Random mp3 selector and player ) 
Entonces, soy un glotón para el castigo, o no tengo vida, pero yo escribió un script para responder una pregunta sobre Preguntar en preguntar Ubuntu como sol...

-1  Aleatorizar una lista de objetos jquery  ( Randomize a jquery object list ) 
Bueno, este fue un competencia de código más simple en mi trabajo. Probé un par de cosas, aceptaron, pero ninguno de ellos lo quería. Porque ambos siempre est...

14  Generación de token del proveedor de OAURH  ( Oauth provider token generation ) 
Actualmente estoy creando una oauth proveedor en Java usando jersey . A lo mejor de mi conocimiento, Jersey no proporciona un método para crear tokens de O...

6  Clasificación de números no repetidos aleatorios  ( Sorting random non repeating numbers ) 
Estoy trabajando en un programa en el que 10000 números no repetidos aleatorios se clasifican de forma selectiva en orden ascendente " Team | Another Team ...

20  Algoritmo de arrastre para un juego de "Supongo que afinar"  ( Shuffling algorithm for a guess that tune game ) 
Estoy haciendo un juego de "Supongo que afinar" en Visual Basic 6 que se supone que debe jugar cada canción en un orden aleatorio: ' from frmGuessGame.frm ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos