grofab95 / salarycalculator Goto Github PK
View Code? Open in Web Editor NEWSimple application to calculate salary. Different versions: console, win-forms and web-api.
Simple application to calculate salary. Different versions: console, win-forms and web-api.
Dodać brakujące testy i poprawić istniejące.
Jak wcześniej - to jest po prostu ParseToInt.
Nowa nazwa klasy: StringToNumbersConverter albo Parser.
Niby spoko ale wiemy, że miesięcy nie ubędzie ani nie przybędzie, dlatego ogólnie jestem bardziej za pierwszą wersją, ale zostaw. Ta też jest ok ale można trochę lepiej.
Zmienne w klasie:
private readonly System.Drawing.Font _defaultMonthLabel = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 238);
private readonly Padding _defaultPadding = new Padding(0, 1, 0, 6);
Ciało metody:
...
var monthsLabels = Enumerable
.Range(1, 12)
.Select(index => new Label
{
Text = _monthsWorkingHours[index].ToString(),
Font = _defaultMonthLabel,
Margin = _defaultPadding
});
foreach (var monthsLabel in monthsLabels)
{
flowLayoutPanel1.Controls.Add(monthsLabel);
}
Myślę że tak jest czytelniej. Są dwie iteracje ale przy tej liczbie elementów to nie ma znaczenia, wcześniej było gorzej - przy każdej iteracji pętli tworzyłeś nowy obiekt Font i Padding chociaż jest taki sam dla każdej iteracji ;)
usuń projekt SalaryCalculator z repo.
Do takich rzeczy jak już to się robie Enuma. Np:
public enum ConfigurationWindowMode {
FixInvalidConfiguration
EditConfiguration
}
Należy użyć innej kontrolki. TextArea czy jak to tam było w tych formsach i ustawić ją na readonly żeby nie można było w niej pisać.
Assert.Throws(() => StringParser.ParseToDoubleReadWorkedHours(userInput))
FormatException -> nazwałbym to -> "InvalidFormat"
Poza tym w nazwie testu jet Throws_InvalidOperationException a rzuca FormatException. Kłamiesz ;>
Te dwie metody są identyczne :) Tylko inaczej się nazywają. Jedna jest do usunięcia 🙃
Dużo się tu dzieje, możemy trochę ulepszyć (iteracyjne ulepszanie to dobra praktyka inżynierska), Proponuję wprowadzenie w projekcie SalaryCalculator nowych klas, które będzą trzymadełkiem dla obliczeń i współczynników które posłużą do ich otrzymania. Np MonthSalaryReport. Będzie ona miała Property;
Powyżej są 2 nowe klasy. CalculationFactors z propertami:
CalculationSummary:
Następnie Calculate_Button_Click można trochę rozdzielić. Ja bym to widział trochę tak
private void Calculate_Button_Click(object sender, EventArgs e) {
var factors = new Factors(
workedHours = Parser.ParseStringToDouble(WorkedHours_TextBox.Text_
...
);
var summary = CalculateSummary(factors);
var monthSalaryReport = new MonthSalaryReport(factors, summary);
var textReport = new SimpleTextReportBuilder(_monthsWorkingHours).BuildMonthlyReport(monthSalaryReport );
new CalculatorReportWindow(report).ShowDialog();
}
Jakoś tak - i będzie z 9 linijek w metodzie. Może uda Ci się coś usprawnić po drodze. Oczywiście będzie trzeba poprawić trochę apkę konsolową ;) Ale to powinny być proste zmiany - masz testy także możesz być pewien że nic nie zepsujesz po drodze (testy też będzie trzeba poprawić).
Brakuje testów, które sprawdzają czy walidacja działa. Sprawdzane jest tylko czy rzucane są wyjątki.
KalkulatorWynagrodzen -> SalaryCalculator.Console
Console.Tests -> SalaryCalculator.Console.Tests
po zmianie nazwy projektów upewni się, że wszędzie są dobre namespaces i sprawdź czy default namespace też się zmienił. W razie czego zmień ręcznie (znajdziesz na nacie - how to set project default namespace in visual studio)
SalaryCalculator.Tests2
wywal tą dwójkę ;)
Nie ma testów które sprawdzają czy kod działa, są tylko takie które sprawdzają czy są rzucane wyjątki.
Jak dla mnie to tu jest tylko ParseStringToDouble - dlaczego WorkedHours? WorkedHours jest później jak jest sprawdzanie czy ktoś nie pojechał z ich ilością.
Jakie 0, jakie 1? Chyba chciałeś tak;
var isConfigurationValid = true / false
To jest tak proste że mogło być razem.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.