Skip to content

Instantly share code, notes, and snippets.

@vkhorikov
vkhorikov / Customer.cs
Last active October 16, 2019 23:57
With primitive obsession
public class Customer
{
public string Name { get; private set; }
public string Email { get; private set; }
public Customer(string name, string email)
{
// Validate name
if (string.IsNullOrWhiteSpace(name) || name.Length > 50)
throw new ArgumentException("Name is invalid");
@vkhorikov
vkhorikov / Customer.cs
Last active January 29, 2022 14:02
Without primitive obsession
public class Customer
{
public CustomerName Name { get; private set; }
public Email Email { get; private set; }
public Customer(CustomerName name, Email email)
{
if (name == null)
throw new ArgumentNullException("name");
if (email == null)
@vkhorikov
vkhorikov / CustomerController.cs
Last active May 4, 2024 01:25
Handling failures and input errors in a functional way
[HttpPost]
public HttpResponseMessage CreateCustomer(string name, string billingInfo)
{
Result<BillingInfo> billingInfoResult = BillingInfo.Create(billingInfo);
Result<CustomerName> customerNameResult = CustomerName.Create(name);
return Result.Combine(billingInfoResult, customerNameResult)
.OnSuccess(() => _paymentGateway.ChargeCommission(billingInfoResult.Value))
.OnSuccess(() => new Customer(customerNameResult.Value))
.OnSuccess(
public void Create(string name, string email, string billingInfo)
{
Result<CustomerName> nameResult = CustomerName.Create(name);
Result<Email> emailResult = Email.Create(email);
Result<BillingInfo> billingInfoResult = BillingInfo.Create(billingInfo);
return Result.Combine(nameResult, emailResult, billingInfoResult)
.OnSuccess(() => _paymentGateway.ChargeCommission(billingInfoResult.Value));
/* Other OnSuccess, OnFailure, OnBoth methods */
}
public abstract class Error
{
public abstract ErrorType Type { get; }
}
public class SimpleError : Error
{
public override ErrorType Type { get { return ErrorType.Simple; } }
public string Message { get; private set; }
public class Order
{
private readonly List<OrderLine> _lines;
public Order()
{
_lines = new List<OrderLine>();
}
public decimal Amount
[Fact]
public void Amount_shows_order_amount()
{
// Arrange
var order = new Order();
order.AddLine(10, new Product());
order.AddLine(20, new Product());
// Act
decimal amount = order.Amount;
[Fact]
public void Parser_parses_xml_in_correct_order()
{
// Arrange : input values
string xml = "<outer><inner /></outer>";
var parser = new Parser();
// Arrange : record expectations
var mocks = new MockRepository();
IHandler handler = mocks.CreateMock<IHandler>();
@vkhorikov
vkhorikov / UserTests.cs
Created January 21, 2016 02:35
Arrange Section reuse example
public class UserTests
{
[Fact]
public void Should_fire_event_after_provisioning()
{
// Arrange
Organization organization = CreateOrganization();
User user = CreateUser(organization);
Subscription subscription = CreateSubscription(Package.Streamer, organization);
public class UserBuilder
{
private readonly string _firstName;
private readonly string _lastName;
public UserBuilder()
: this(Guid.NewGuid().ToString(), Guid.NewGuid().ToString())
{
}