Создания и проверки штрихкодов EAN-13


Я разработал консольное приложение для генерации и проверки кодов EAN-13 штрих-кодов. Я планирую разработать формы Windows коллегой, чтобы представить их в виде изображений с использованием шрифта штрих-кода.

Я может протестировать интерфейс консоли, используя Process.

Калькулятор.в CS

using System;

namespace Ean13Calc
{
    public static class InternationalArticleNumber13Calculator
    {
        private static int Sz = 12;

        public static string InternationalArticleNumber13(int[] firstDigits = null)
        {
            int alt, digit, checkDigit, summedProduct = 0;
            Random randomDigits = new Random();
            bool isNull;
            if (firstDigits == null)
            {
                firstDigits = new int[Sz];
                isNull = true;
            }
            else
                isNull = false;
            for (int idx = 0; idx < Sz; idx++)
            {
                if (idx % 2 == 0)
                    alt = 1;
                else
                    alt = 3;
                if (isNull)
                {
                    digit = randomDigits.Next(10);
                    firstDigits[idx] = digit;
                }
                else
                    digit = firstDigits[idx];
                summedProduct += digit * alt;
            }
            checkDigit = 10 - summedProduct % 10;
            if (checkDigit == 10)
                checkDigit = 0;
            return string.Join("", firstDigits) + checkDigit.ToString();
        }

        public static string CalculateFromParsedNumber(string number)
        {
            int[] firstDigits = new int[Sz];
            int digit;
            if (number.Length != Sz | !long.TryParse(number, out long _))
                return null;
            for (int idx = 0; idx < Sz; idx++)
            {
                digit = int.Parse(number[idx].ToString());
                firstDigits[idx] = digit;
            }
            return InternationalArticleNumber13(firstDigits);
        }

        public static bool Validate(string number)
        {
            if (number.Length != Sz + 1)
                return false;
            return number == CalculateFromParsedNumber(number.Remove(Sz));
        }
    }
}

Программы.в CS

using System;
using System.Windows.Forms;

namespace Ean13Calc
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            string result;
            if (args.Length == 2 && args[0] == "-v")
            {
                Console.WriteLine("Is valid: {0}", InternationalArticleNumber13Calculator.Validate(args[1]));
                return;
            }
            if (args.Length == 1)
                result = InternationalArticleNumber13Calculator.CalculateFromParsedNumber(args[0]);
            else
                if (args.Length == 0)
                result = InternationalArticleNumber13Calculator.InternationalArticleNumber13();
            else
                return;
            if (result == null)
                Console.WriteLine("Error: expects 12 digits");
            else
            {
                Clipboard.Clear();
                Clipboard.SetText(result);
                Console.WriteLine("Barcode (in clipboard): {0}", result);
            }
        }
    }
}

Тесткейса.в CS

using Microsoft.VisualStudio.TestTools.UnitTesting;

using Ean13Calc;

namespace Ean13Test
{
    [TestClass]
    public class TestCase
    {
        [TestMethod]
        public void TestWithDigits()
        {
            string firstDigits = "978030640615";
            string result = InternationalArticleNumber13Calculator.CalculateFromParsedNumber(firstDigits);
            Assert.AreEqual(firstDigits + "7", result);
            Assert.AreEqual(result.Length, 13);
        }

        [TestMethod]
        public void TestLength()
        {
            string result;
            for (int i = 0; i < 1000; i++)
            {
                result = InternationalArticleNumber13Calculator.InternationalArticleNumber13();
                Assert.AreEqual(result.Length, 13);
                Assert.IsTrue(InternationalArticleNumber13Calculator.Validate(result));
            }
        }

        [TestMethod]
        public void TestWrongInput()
        {
            string result = InternationalArticleNumber13Calculator.CalculateFromParsedNumber("0");
            Assert.IsNull(result);
        }
    }
}


632
2
задан 15 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ

Я просто собираюсь идти построчно через часть Ваш класс калькулятор.


namespace Ean13Calc
{
public static class InternationalArticleNumber13Calculator
{

Хорошее название для класса. Очень описательный.
Обычно я не выступаю за сокращение, но я на самом деле думаю, что лучше сократить до одного.
Проработав в розницу, каждый в области знает, что такое НАЙТРОКС есть.
Почти никто не знает, что за этим стоит.
Использовать термин и аббревиатура домена для этого.

(Чтобы было понятно, я, как правило, сказать вам обратное. Укорачивал вещи не должны быть нормой.)


   private static int Sz = 12;

Как здесь. Нет никаких причин, чтобы сократить это. Использовать Sizeили лучше EANLength.
Кроме того, это должно быть постоянным, так что вы не можете случайно присвоить ему новое значение.


   public static string InternationalArticleNumber13(int[] firstDigits = null)
{

Почему вы ставите по умолчанию null?
Массив-это уже по умолчанию null.
Если вы хотите версию этого метода, который не принимает никаких методов, использовать перегрузку метода без параметров.
Он гораздо меньше подвержен ошибкам, чем намеренно вводить нули в коде.


       int alt, digit, checkDigit, summedProduct = 0;

Я относительно уверен, что это работает только случайно.
Значение по умолчанию интервал равен нулю, так что я на самом деле не зная фактическое поведение здесь (и я был с использованием C# долгое время).

Рассмотрим альтернативный код.

int alt, digit, checkDigit, summedProduct = 1;

Являются alt, digitи checkDigit ноль или один?

Только объявить одну переменную в строку, и мы никогда не должны думать об этом.


        bool isNull;
if (firstDigits == null)
{
firstDigits = new int[Sz];
isNull = true;
}
else
isNull = false;
for (int idx = 0; idx < Sz; idx++)

Использовать скобки вокруг что-нибудь еще, или хотя бы добавить новую строку перед следующим заявлением.

--

Есть еще, но это, вероятно, хорошее начало. Я хотел бы попробовать, чтобы исправить эти проблемы (везде, некоторые из них появляются в нескольких местах), чтобы сделать его более читабельным затем вернулся за второй комментарий.

0
ответ дан 18 марта 2018 в 02:03 Источник Поделиться