C # Лучшая реализация файла JSON - PullRequest
0 голосов
/ 19 ноября 2018

Это домашнее задание, так что если вы можете помочь, спасибо, если нет, я понимаю.

Все работает, как задумано.Но я чувствую, что мог бы реализовать вещи лучше или иметь более чистый код.Я хотел бы, чтобы кнопка просто вызывала метод, который читает файл JSON, запускает запрос и выдает правильное отображение без дублирования кода, как у меня.

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace EmployeePayDataWk4
{
public partial class Employee_Pay_Form : Form
{       

    public Employee_Pay_Form()
    {
        InitializeComponent();            
    }

    private void Employee_Pay_Form_Load(object sender, EventArgs e)
    {
        EmployeeDataGridView.ColumnCount = 8;
        EmployeeDataGridView.Columns[0].Name = "Employee Name";
        EmployeeDataGridView.Columns[1].Name = "Zip Code";
        EmployeeDataGridView.Columns[2].Name = "Age";
        EmployeeDataGridView.Columns[3].Name = "Monthly Gross Pay";
        EmployeeDataGridView.Columns[4].Name = "Department ID";
        EmployeeDataGridView.Columns[5].Name = "Developer Type";
        EmployeeDataGridView.Columns[6].Name = "Annual Taxes";
        EmployeeDataGridView.Columns[7].Name = "Annual Net Pay";            

    }

    private void LoadAllButton_Click(object sender, EventArgs e)
    {
        EmployeeDataGridView.Rows.Clear();
        //Read from JSON file
        string JSONstring = File.ReadAllText("JSON.json");
        List<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

        //Display into DataGridView
        foreach (Employee emp in employees)
        {
            string[] row = { emp.Name, emp.Zip, emp.Age.ToString(), string.Format("{0:C}", emp.Pay),
                emp.DepartmentId.ToString(), SetDevType(emp.DepartmentId),
                string.Format("{0:C}", emp.CalculateTax(emp.Pay)),
                string.Format("{0:C}", AnnualPay(emp.Pay) - emp.CalculateTax(emp.Pay))};
            EmployeeDataGridView.Rows.Add(row);
        }
    }



    private void FTEmployeeButton_Click(object sender, EventArgs e)
    {
        EmployeeDataGridView.Rows.Clear();

        //Read from JSON file
        string JSONstring = File.ReadAllText("JSON.json");
        List<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

        //LINQ Query for FT Employees
        var FTEmp = from emp in employees
                    where emp.GetTaxForm == "W2"
                    select emp;

        //Display into DataGridView
        foreach (Employee emp in FTEmp)
        {
            string[] row = { emp.Name, emp.Zip, emp.Age.ToString(), string.Format("{0:C}", emp.Pay),
                emp.DepartmentId.ToString(), SetDevType(emp.DepartmentId),
                string.Format("{0:C}", emp.CalculateTax(emp.Pay)),
                string.Format("{0:C}", AnnualPay(emp.Pay) - emp.CalculateTax(emp.Pay))};
            EmployeeDataGridView.Rows.Add(row);
        }
    }

    private void ContractEmployeeButton_Click(object sender, EventArgs e)
    {
        EmployeeDataGridView.Rows.Clear();

        //Read from JSON file
        string JSONstring = File.ReadAllText("JSON.json");
        List<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

        //LINQ Query for Contract Employees
        var contractEmp = from emp in employees
                          where emp.GetTaxForm == "1099"
                          select emp;

        //Display into DataGridView
        foreach (Employee emp in contractEmp)
        {
            string[] row = { emp.Name, emp.Zip, emp.Age.ToString(), string.Format("{0:C}", emp.Pay),
                emp.DepartmentId.ToString(), SetDevType(emp.DepartmentId),
                string.Format("{0:C}", emp.CalculateTax(emp.Pay)),
                string.Format("{0:C}", AnnualPay(emp.Pay) - emp.CalculateTax(emp.Pay))};
            EmployeeDataGridView.Rows.Add(row);
        }
    }


    //Method to determine developer type
    string typeName;
    public string SetDevType(int id)
    {
        if (id == 1)
        {
            typeName = "Object-Oriented";
        }
        else if (id == 2)
        {
            typeName = "Scripts";
        }
        else { typeName = "Unknown"; }
        return typeName;
    }

    public double AnnualPay(double amount) => 12 * amount;
}


class Employee : IFilingStatus
{
    public Employee() { }

    public string Name { get; set; }
    public string Zip { get; set; }
    public int Age { get; set; }
    public double Pay { get; set; }
    public int DepartmentId { get; set; }  
    public string GetTaxForm { get; set; }

    public double CalculateTax(double basis)
    {
        double monthlyTax; 

        if ((GetTaxForm == "W2") || (GetTaxForm == "w2"))
        {
            monthlyTax = .07 * basis;
        }
        else
        {
            monthlyTax = 0;
        }
        return 12 * monthlyTax;
    }
    public double AnnualPay(double amount) => 12 * amount;
}

public interface IFilingStatus
{
    double CalculateTax(double basis);
}

}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Как я вижу, ваши обработчики событий Click очень похожи.

Я вижу только одно изменение:

В вашем обработчике событий FTEmployeeButton_Click вы фильтруете данные следующим образом:

var contractEmp = from emp in employees
                  where emp.GetTaxForm == "1099"
                  select emp;

А в обработчике событий ContractEmployeeButton_Click вы фильтруете данные следующим образом:

var FTEmp = from emp in employees
            where emp.GetTaxForm == "W2"
            select emp;

Другой код выглядит очень похоже.Таким образом, мы можем определить ваш код для одного отдельного метода ...

Но нам нужно понять, как фильтровать ваши данные.

Для этого я предлагаю использовать свойство Tag Класс кнопки.

В этом свойстве вы можете сохранить любой объект.В вашем случае вы можете сохранить GetTaxForm значение.

Таким образом, вы можете использовать только один обработчик событий для всех ваших кнопок.

Пожалуйста, посмотрите следующую реализацию:

private void OnButton_Click(object sender, EventArgs e)
{
    EmployeeDataGridView.Rows.Clear();

    //Read from JSON file
    string JSONstring = File.ReadAllText("JSON.json");
    List<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

    object filter = ((Control)sender).Tag;
    List<Employee> FTEmp;

    if (filter != null) {
        //LINQ Query for FT Employees
        FTEmp = from emp in employees
                    where emp.GetTaxForm == filter.ToString()
                   select emp;
    }
    else 
    {
       FTEmp = employees.ToList();
    }

    //Display into DataGridView
    foreach (Employee emp in FTEmp)
    {
        string[] row = { emp.Name, emp.Zip, emp.Age.ToString(), string.Format("{0:C}", emp.Pay),
            emp.DepartmentId.ToString(), SetDevType(emp.DepartmentId),
            string.Format("{0:C}", emp.CalculateTax(emp.Pay)),
            string.Format("{0:C}", AnnualPay(emp.Pay) - emp.CalculateTax(emp.Pay))};
        EmployeeDataGridView.Rows.Add(row);
    }
}
0 голосов
/ 20 ноября 2018

Я бы сказал эту строку:

List<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

должно быть

IList<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

для по этой причине .

локальные переменные, частные поляи параметры должны быть строчными буквами верблюда, согласно StyleCop:

string jsonString = File.ReadAllText("JSON.json");

Другое дело - не повторяться (СУХОЙ).Эти несколько строк могут быть реорганизованы в отдельный метод:

string JSONstring = File.ReadAllText("JSON.json");
        List<Employee> employees = JsonConvert.DeserializeObject<List<Employee>>(JSONstring);

        //LINQ Query for Contract Employees
        var contractEmp = from emp in employees
                          where emp.GetTaxForm == "1099"
                          select emp;

В SetDevType вы можете полностью использовать переключатель / регистр, который работает лучше.

string typeName; // why do we need this?
private string SetDevType(int id)
{
    string typeName = string.Empty;
    switch(id){
        case 1: typeName = "Something"; break;
        default: typeName = "Unknown";
    }
    return typeName;
}

некоторые членыкласс не должен быть общедоступным, например,

public double AnnualPay(double amount) => 12 * amount;

может быть

private double AnnualPay(double amount) => 12 * amount;

, и этот метод каким-то образом также находится в классе Employee, который является классом Model /ПОКО.Классы POCO обычно не содержат не-свойств (хотя иногда включаются ToString и пустой конструктор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...