@nordwind2013

Калькулятор на mvc с историей операций?

В задании нужно реализовать калькулятор с логом,в котором отображаются предыдущие вычисления. Подскажите,как реализовать этот лог?
  • Вопрос задан
  • 736 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Если для веб и именно на ASP.NET, то можно:

1. Реализовать структуру или класс для хранения элемента данных (истории) и использовать статический класс, свойство или поле (например, на уровне класса контроллера) для всей истории:

public class HistoryItem 
{

  public double X { get; set; }

  public double Y { get; set; }

  public string Operation { get; set; }

  // предполагается, что журнал подразумевает хранение истории вычислений,
  // и хотя можно повторно провести вычисления, в журнале такого по идее быть не должно,
  public double Result { get; set; }

}

// ...

public static List<HistoryItem> History = new List<HistoryItem>();

// ...

History.Add(new HistoryItem { X = 123, Y = 456, Operation = "+", Result =  579 });
History.Add(new HistoryItem { X = 5, Y = 5, Operation = "*", Result = 25 });

или проще, без HistoryItem, записывать в виде строк:

public static List<string> History = new List<string>();

// ...

History.Add("2 * 2 = 4");
History.Add("3 + 4 = 7");

Можно сделать поправку на многопоточность и использовать что-нибудь потокобезопасное:

using System.Collections.Concurrent;

// ...

public static ConcurrentBag<string> History = new ConcurrentBag<string>();

// ...

History.Add("123 + 345 = 468");
History.Add("7 * 7 = 49");

Но при такой реализации, история будет доступна только в рамках жизненного цикла приложения.

2. Записывать в текстовой файл:

// добавить
System.IO.File.AppendText("history.log", "5 * 5 = 25");
// прочитать историю
// System.IO.File.ReadAllText("history.log");

При такой реализации, файл истории будет доступен в рамках жизненного цикла устройства хранения данных, пока последняя резервная копия не будет утрачена :-)

3. Записывать в базу данных.

Примерно такой же вариант, как и с записью в файл, но более сложный.

---

Если условия задачи позволяют, я бы наверное сделал на стороне клиента (JavaScript) и использовал localStorage:

var historyData = window.localStorage.getItem('history');
var history = historyData ? JSON.parse(historyData) : [];

history.push('1 + 1 = 2');
history.push('2 + 2 = 4');
history.push('4 + 4 = 8');

window.localStorage.setItem('history', JSON.stringify(history));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Для лога можно использовать паттерн Memento: https://en.wikipedia.org/wiki/Memento_pattern
Ответ написан
Комментировать
kinglostov
@kinglostov
просто lostov
Ну не знаю как там другие скажет я бы с помощью структуры всё записал бы как большой массив
https://docs.microsoft.com/en-us/dotnet/csharp/pro...
Пример
public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
class TestCoOrds
{
    static void Main()
    {
        // Initialize:   
        CoOrds coords1 = new CoOrds();
        CoOrds coords2 = new CoOrds(10, 10);

        // Display results:
        Console.Write("CoOrds 1: ");
        Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

        Console.Write("CoOrds 2: ");
        Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

CoOrds 1: x = 0, y = 0
CoOrds 2: x = 10, y = 10
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы