elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Java [Guía] Patrones de diseño - Parte 1


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  [SOURCE-CODE] [VB] Implementación del Sistema Internacional de Unidades (SI)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOURCE-CODE] [VB] Implementación del Sistema Internacional de Unidades (SI)  (Leído 137 veces)
Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 8.870


El sentido común es el menos común de los sentidos


Ver Perfil
[SOURCE-CODE] [VB] Implementación del Sistema Internacional de Unidades (SI)
« en: 20 Abril 2017, 19:56 »

Introducción


Hola.

Algo que siempre he querido hacer es un sistema de conversión entre unidades. Puesto que la aritmética compleja y la ciencia en general no es lo mio, he tomado como base un proyecto ya hecho el cual me pareció bastante profesional: https://www.codeproject.com/Articles/611731/Working-with-Units-and-Amounts

El código fuente original está escrito en C#, mi trabajo ha consistido en hacer lo siguiente:

  • Migrar el código al lenguaje VB.NET
  • Adaptarlo para darle una usabilidad distinta que humildemente considero mejor, y que no se enfocase solamente en el Sistema Internacional de Unidades.
  • Podar bastante código que era innecesario en la adaptación (todo el código de la clase UnitManager.cs, entre otros).
  • Añadir más unidades (Información Digital y Velocidad de transferencia de datos digitales, entre otras)
  • Documentar todos los miembros del código, e incluir referencias a Wikipedia en la documentación.
  • Actualizar las constantes universales de la Física (clase: PhysicsConstant.cs)

    La adaptación del código la he finalizado hoy, y dentro de lo que he probado parece funcionar todo correctamente... hasta donde yo lo he probado, insisto. Espero no haber cometido ningún error ni haberme pasado nada importante por alto; como ya digo en un principio parece funcionar correctamente, y en caso contrario pueden notificarme algún bug o algún fallo de diseño e intentaré corregirlo.

    Sin más, espero que este aporte les resulte de utilidad. :D





    Características


    Una unidad (ej. Kilogramo) se representa mediante la clase Unit, y la clase Amount representa una cantidad de una unidad específica.
    Podemos utilizar los métodos (y también los operadores aritméticos) de una instancia de la clase Amount para modificar/sumar/restar/dividir/elevar/etc el valor/cantidad, y también podemos utilizar la función Amount.ConvertedTo() para convertir dicha cantidad a la cantidad equivalente de otra unidad compatible.

    Estas son las unidades de conversión disponibles:

  • Volumen
    · Litre
    · DeciLitre
    · CentiLitre
    · MilliLitre
    · MicroLitre
    · NanoLitre
    · DecaLitre
    · HectoLitre
    · KiloLitre
    · Cubic Metre

  • Tiempo
    · Second
    · MilliSecond
    · MicroSecond
    · NanoSecond
    · Minute
    · Hour
    · Day
    · Week
    · Month
    · Year
    · Decade
    · Century
    · Millennium

  • Superficie
    · Square Metre
    · Square KiloMetre
    · Are
    · HectAre

  • Velocidad
    · Metres Per Second
    · Kilometres Per Hour
    · Miles Per Hour
    · Knot

  • Presión
    · Pascal
    · HectoPascal
    · KiloPascal
    · Bar
    · MilliBar
    · Atmosphere

  • Masa
    · KiloGram
    · Gram
    · MilliGram
    · MicroGram
    · NanoGram
    · Ton

  • Intensidad luminiscente
    · Candela

  • Longitud
    · Metre
    · DeciMetre
    · CentiMetre
    · MilliMetre
    · DecaMetre
    · HectoMetre
    · KiloMetre
    · Inch
    · Foot
    · Yard
    · Mile
    · Nautical Mile
    · Light Year

  • Frecuencia
    · Hertz
    · KiloHertz
    · MegaHertz
    · RPM

  • Fuerza
    · Newton

  • Energía
    · Joule
    · KiloJoule
    · MegaJoule
    · GigaJoule
    · Watt
    · KiloWatt
    · MegaWatt
    · Watt-Second
    · Watt-Hour
    · KiloWatt-Second
    · KiloWatt-Hour
    · Calorie
    · KiloCalorie
    · Horse Power

  • Corriente eléctrica
    · Ampere
    · Coulomb
    · Volt
    · Ohm
    · Farad

  • Cantidad de sustancia
    · Mole
    · MilliMole
    · MicroMole
    · NanoMole

  • Temperatura termodinámica
    · Kelvin
    · Celcius Degree
    · Fahrenheit Degree

  • Información digital
    · Bit
    · Kilobit
    · Megabit
    · Gigabit
    · Terabit
    · Petabit
    · Exabit
    · Byte
    · Kilobyte
    · Megabyte
    · Gigabyte
    · Terabyte
    · Petabyte
    · Exabyte

  • Velocidad de transferencia de datos digitales
    · Bits Per Second
    · Kilobits Per Second
    · Megabits Per Second
    · Gigabits Per Second
    · Terabits Per Second
    · Bytes Per Second
    · Kilobytes Per Second
    · Megabytes Per Second
    · Gigabytes Per Second
    · Terabytes Per Second

    El código fuente incluye las siguientes constantes físicas que se pueden utilizar como unidades:

    · Atomic Mass
    · Avogadro
    · Boltzmann
    · Electric
    · Electron Mass
    · Electron Volt
    · Elementary Charge
    · Faraday
    · Gravitational
    · Magnetic
    · Molar Gas
    · Planck
    · Proton Mass
    · Rydberg
    · Speed of Light
    · Stefan-Boltzmann





    Ejemplos de uso


    Un ejemplo de uso para convertir unidades de información digital (Bits):
    Código
    1. Dim b1 As New Amount(1, Units.DigitalInformation.Byte)
    2. Dim kb1 As New Amount(1, Units.DigitalInformation.Kilobyte)
    3. Dim mb1 As New Amount(1, Units.DigitalInformation.Megabyte)
    4.  
    5. Dim sb As New StringBuilder()
    6. With sb
    7.     .AppendLine(String.Format("{0} bytes is equal to {1} bits", b1.Value, b1.ConvertedTo(Units.DigitalInformation.Bit).Value))
    8.     .AppendLine(String.Format("{0} bytes is equal to {1} bytes", b1.Value, b1.ConvertedTo(Units.DigitalInformation.Byte).Value))
    9.  
    10.     .AppendLine(String.Format("{0} kilobytes is equal to {1} bits", kb1.Value, kb1.ConvertedTo(Units.DigitalInformation.Bit).Value))
    11.     .AppendLine(String.Format("{0} kilobytes is equal to {1} bytes", kb1.Value, kb1.ConvertedTo(Units.DigitalInformation.Byte).Value))
    12.     .AppendLine(String.Format("{0} kilobytes is equal to {1} kilobits", kb1.Value, kb1.ConvertedTo(Units.DigitalInformation.Kilobit).Value))
    13.     .AppendLine(String.Format("{0} kilobytes is equal to {1} kilobytes", kb1.Value, kb1.ConvertedTo(Units.DigitalInformation.Kilobyte).Value))
    14.  
    15.     .AppendLine(String.Format("{0} megabytes is equal to {1} bits", mb1.Value, mb1.ConvertedTo(Units.DigitalInformation.Bit).Value))
    16.     .AppendLine(String.Format("{0} megabytes is equal to {1} bytes", mb1.Value, mb1.ConvertedTo(Units.DigitalInformation.Byte).Value))
    17.     .AppendLine(String.Format("{0} megabytes is equal to {1} kilobits", mb1.Value, mb1.ConvertedTo(Units.DigitalInformation.Kilobit).Value))
    18.     .AppendLine(String.Format("{0} megabytes is equal to {1} Kilobytes", mb1.Value, mb1.ConvertedTo(Units.DigitalInformation.Kilobyte).Value))
    19.     .AppendLine(String.Format("{0} megabytes is equal to {1} megabits", mb1.Value, mb1.ConvertedTo(Units.DigitalInformation.Megabit).Value))
    20.     .AppendLine(String.Format("{0} megabytes is equal to {1} megabytes", mb1.Value, mb1.ConvertedTo(Units.DigitalInformation.Megabyte).Value))
    21. End With
    22.  
    23. Console.WriteLine(sb.ToString())

    Las posibilidades son "infinitas", pueden por ejemplo diseñar una bonita interfáz de usuario para crear un conversor de unidades, o en el caso de las unidades de información digital se le podría dar una utilidad distinta para representar el tamaño de un archivo en una interfáz de usuario.

    Nótese que he utilizado el sistema binario para el tratamiento de la unidad Bit y Byte y sus múltiplos, y he optado por utilizar los nombres del sistema decimal, puesto que esto parece ser lo convencional (aunque no lo más correcto).





    Descarga


    Hacer click en la imagen para descargar el código fuente.






    Preguntas Frecuentes


  • ¿Cómo utilizo esto?.
    1. Compila el código fuente. Se generará un archivo llamado Elektro.Core.dll
    2. Crea un nuevo proyecto en VisualStudio y añade una referencia a la librería Elektro.Core.dll (click derecho: Add Reference)
    3. Listo. Para saber como utilizar los miembros de la librería, mira el ejemplo que puse más arriba o analiza el código fuente.

  • ¿Puedo utilizar la librería en C#?.
    Por supuesto, no hay que seguir ningún paso adicional, tan solo añade una referencia de la librería a tu proyecto.

  • ¿Qué versión de .NET Framework necesito para usar la librería?.
    En el código fuente hay varias configuraciones de proyecto para compilar bajo .NET Framework 4.0, 4.5 o 4.6.

  • ¿Cómo añado una nueva unidad al código fuente?.
    Teniendo el proyecto abierto en VisualStudio, en el explorador de solución dirígete a la carpeta Maths/Tools/Units, allí encontrarás todas las definiciones de las unidades existentes; puedes tomarlos como ejemplo.
    En caso de que sea necesario definir conversiones complejas para una unidad, puedes utilizar la clase UnitConversion, para ello toma como ejemplo las definiciones de las unidades de temperatura, en la clase Units_Temperature.vb (Kelvin, DegreeCelcius y DegreeFahrenheit)

  • ¿Puedo crear unidades en tiempo de ejecución?.
    Si, tan solo crea una nueva instancia de la clase Unit y le pasas los valores correspondientes al constructor de clase.

  • ¿Vas a ir actualizando y añadiendo mejoras o correcciones en el código fuente?.
    Con respecto a las mejoras: por el momento lo dejo así tal y como está, puesto que cubre todas mis necesidades.
    Con respecto a las correcciones: corregiré cualquier cosa, siempre y cuando haya algo que se deba corregir.

  • ¿Puedo preguntarte cosas que no entienda del código fuente o del funcionamiento de la librería?.
    Por supuesto, mi intención es ayudar en todo lo posible, pero utiliza el foro, no mensajes privados ni e-mails.

  • ¿Aceptas críticas y/o sugerencias?.
    Por supuesto, ¡faltaría más!. Cualquier ayuda es bien recibida.

  • ¿Puedo compartir esta librería en otras páginas web?.
    Sin problema, pero por favor, que se mencione al autor (es decir, a mi, y al autor del que tomé la idea).


« Última modificación: 20 Abril 2017, 20:49 por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines