Задачи на лайв-кодинг: что выведет код, рефакторинг, написать эндпоинт

↑ 9.2 Финальная подготовка: проекты, live coding, вопросы · ← Предыдущая · → Следующая

Обязательно~6 мин чтенияУровень: senior

Зачем это на собесе

Три типовых формата: «что выведет код», «найдите проблемы и отрефакторите», «напишите эндпоинт».

1. Что выведет код

// Задача 1
var list = new List<int> { 1, 2, 3 };
IEnumerable<int> q = list.Where(x => x > 1);
list.Add(4);
Console.WriteLine(string.Join(",", q));
// Задача 2
var actions = new List<Action>();
for (int i = 0; i < 3; i++) actions.Add(() => Console.Write(i));
foreach (var a in actions) a();
// Задача 3
async Task<int> Work() { await Task.Delay(100); return 1; }
var t = Work();
Console.WriteLine("A");
Console.WriteLine(await t);
Console.WriteLine("B");
// Задача 4
string s = "a"; object o = s; s += "b";
Console.WriteLine(o == (object)"a");

2. Найдите проблемы и отрефакторите

public class OrderService
{
    public List<Order> GetOrders(string customer)
    {
        var db = new SqlConnection("Server=...;Password=123");
        db.Open();
        var cmd = new SqlCommand("select * from orders where customer='" + customer + "'", db);
        var reader = cmd.ExecuteReader();
        var res = new List<Order>();
        while (reader.Read()) res.Add(new Order { Id = (int)reader[0] });
        return res;
    }
}
public async Task<List<OrderDto>> GetOrdersAsync(string customer, CancellationToken ct)
{
    await using var conn = await dataSource.OpenConnectionAsync(ct);
    return (await conn.QueryAsync<OrderDto>(
        new CommandDefinition("select id, number, total from orders where customer = @customer order by id limit 100", new { customer }, cancellationToken: ct))).ToList();
}

3. Напишите эндпоинт

Условие: POST /orders принимает { customerId, items: [{ sku, qty }] }, создаёт заказ, возвращает 201 и Location; валидирует вход, не создаёт заказ дважды при повторе запроса.

app.MapPost("/orders", async (CreateOrderRequest req, HttpContext http, IValidator<CreateOrderRequest> validator,
    IOrderService orders, CancellationToken ct) =>
{
    var v = await validator.ValidateAsync(req, ct);
    if (!v.IsValid) return Results.ValidationProblem(v.ToDictionary());
 
    var key = http.Request.Headers["Idempotency-Key"].ToString();
    if (string.IsNullOrEmpty(key)) return Results.Problem("Idempotency-Key required", statusCode: 400);
 
    var result = await orders.CreateAsync(req, key, ct);           // внутри: unique(key) + транзакция
    return result switch
    {
        { IsDuplicate: true } => Results.Ok(result.Order),         // повтор: тот же результат
        _ => Results.Created($"/orders/{result.Order.Id}", result.Order),
    };
}).RequireAuthorization();

Что обсудить: авторизация и проверка владельца, транзакция, идемпотентность, события (outbox), тесты, коды ошибок, лимиты.

Связанные темы