Просто ради аргумента, давайте предположим, что вашим гипотетическим языком был C ++ (хотя он больше похож на Java).В этом случае я бы использовал пространства имен для создания форка, с которым (разумно) легко иметь дело с точки зрения как нового, так и устаревшего кода:
namespace legacy {
class physics {
Float CalculateDistance(float initialDistance, float initialSpeed, float acceleration, float time)
{
// original code here
}
}
}
namespace current {
class physics {
Float CalculateDistance(float initialDistance, float initialSpeed, float acceleration, float time)
{
// corrected code here
}
}
Оттуда у вас есть несколько вариантов:выбирая между двумя.Например, существующий код может добавить директиву using: using legacy::physics;
, и они продолжат использовать существующий код без каких-либо дальнейших изменений.Новый код может добавить using current::physics;
вместо этого, чтобы получить текущий код.Когда вы это сделаете, вы (вероятно) осудите класс legacy::physics
и запланируете его удаление по истечении определенного периода времени, количества ревизий или чего-либо еще.Это дает вашим клиентам возможность проверить свой код и переключиться на новый код упорядоченным образом, при этом пространство имен legacy
не будет слишком загрязнено старым мусором.
Если вы действительно хотите получить подробные сведенияпри этом вы даже можете добавить схему нумерации версий в свои пространства имен, поэтому вместо просто legacy::physics
это может быть v2_7::physics
.Это учитывает возможность того, что даже когда вы «исправляете» код, удаленно возможно, что все еще может быть ошибка или два осталось, так что вы можете в конечном итоге пересмотреть его, и кто-то может в конечном итоге зависеть откакая-то произвольная версия, не обязательно просто оригинал или текущая версия.
В то же время это ограничивает «осведомленность» о версии, которая будет использоваться для одной (довольно) небольшой части кода (илипо крайней мере небольшая часть каждого модуля) вместо того, чтобы распространяться по всему коду.Это также дает довольно безболезненный способ для того, чтобы кто-то скомпилировал модуль с использованием нового кода, проверил наличие ошибок, переключился на старый код, если это необходимо, и т. Д., Без необходимости иметь дело непосредственно с каждым отдельным вызовом рассматриваемой функции.1016 *