Приведи следующий код к идеально профессиональному уровню, ориентируясь на стандарты senior-разработчика. Используй строгие принципы объектно-ориентированного программирования: инкапсуляцию, абстракцию и наследование там, где это обосновано. Обеспечь модульную, расширяемую и поддерживаемую архитектуру, позволяющую легко масштабировать и улучшать систему в будущем. Разбей логику на осмысленные, самостоятельные модули и классы с четкими зонами ответственности, применяй паттерны проектирования, такие как Factory, Strategy, Observer, Dependency Injection или другие подходящие, для повышения гибкости и переиспользуемости. Обеспечь минимум связанности и максимальную когезию между классами и модулями. Везде, где это уместно, добавь абстрактные классы или интерфейсы для выделения общих контрактов. Реализуй наследование, избегая дублирования кода. Инкапсулируй внутренние детали реализации, предоставляя только необходимые публичные методы. Используй полиморфизм для повышения расширяемости и читабельности. Все переменные, функции, методы и классы должны иметь четкие, описательные и читаемые имена, отражающие их назначение, соблюдай единый стиль именования, соответствующий принятому в языке программирования. Оптимизируй алгоритмы и структуры данных для повышения эффективности. Устраняй дублирование и избыточный код. Используй идиоматические конструкции языка. Внедри продуманную систему обработки исключений с детализированными и понятными сообщениями об ошибках. Обрабатывай ожидаемые и неожиданные ошибки адекватно, не допуская краха программы. Добавь исчерпывающие докстринги или комментарии к основным классам, интерфейсам и методам, описывающие их поведение, параметры, возвращаемые значения и возможные исключения. Комментарии должны пояснять сложную логику и мотивы дизайнерских решений, а не банальные детали. Итоговый код должен быть прост для понимания, сопровождения и расширения, легко покрываться модульными тестами при необходимости предусмотри отдельные компоненты для тестирования. Выполни преобразование на основе этих требований, чтобы получить идеальный, качественный, поддерживаемый и профессиональный код.
```lua
if SERVER then
    AddCSLuaFile()
end

SWEP.PrintName = "Rubber Slug Shotgun"
SWEP.Author = "ChatGPT"
SWEP.Instructions = "Left click to fire rubber slug. Non-lethal."
SWEP.Category = "Non-Lethal Weapons"

SWEP.Spawnable = true
SWEP.AdminOnly = false

SWEP.Primary.ClipSize = 6
SWEP.Primary.DefaultClip = 6
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "Buckshot"
SWEP.Primary.Delay = 1

SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"

SWEP.UseHands = true
SWEP.ViewModel = "models/weapons/c_shotgun.mdl"
SWEP.WorldModel = "models/weapons/w_shotgun.mdl"

SWEP.ShotSound = "weapons/shotgun/shotgun_fire6.wav"

function SWEP:Initialize()
    self:SetHoldType("shotgun")
end

function SWEP:PrimaryAttack()
    if not self:CanPrimaryAttack() then return end

    self.Weapon:EmitSound(self.ShotSound)
    self:ShootBullet(15, 6, 0.1)
    self:TakePrimaryAmmo(1)

    self:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
    
    self.Owner:ViewPunch(Angle(-2, math.Rand(-1, 1), 0))
end

-- Переопределяем функцию стрельбы с эффектами резиновых пуль
function SWEP:ShootBullet(damage, num_bullets, aimcone)
    local bullet = {}
    bullet.Num = num_bullets
    bullet.Src = self.Owner:GetShootPos()
    bullet.Dir = self.Owner:GetAimVector()
    bullet.Spread = Vector(aimcone, aimcone, 0)
    bullet.Tracer = 1
    bullet.TracerName = "ToolTracer" -- более "мягкий" эффект прожектора
    bullet.Force = 5
    bullet.Damage = damage
    bullet.Callback = function(attacker, tr, dmginfo)
        local ent = tr.Entity
        if IsValid(ent) and ent:IsPlayer() or ent:IsNPC() then
            dmginfo:SetDamageType(DMG_BULLET)

            -- Оглушение через сеткей
            if SERVER then
                -- Замедляем цель
                if ent:IsPlayer() then
                    -- Пример оглушения: уменьшаем скорость на 50% на 3 секунды
                    ent:SetWalkSpeed(ent:GetWalkSpeed() * 0.5)
                    ent:SetRunSpeed(ent:GetRunSpeed() * 0.5)
                    timer.Simple(3, function()
                        if IsValid(ent) then
                            ent:SetWalkSpeed(ent:GetWalkSpeed() * 2)
                            ent:SetRunSpeed(ent:GetRunSpeed() * 2)
                        end
                    end)
                elseif ent:IsNPC() then
                    -- У NPC можно вызвать анимацию оглушения, например, остановка на 3 сек.
                    ent:SetSchedule(SCHED_WAIT_RANDOM)
                    timer.Simple(3, function()
                        if IsValid(ent) then
                            ent:SetSchedule(SCHED_ALERT_FACE_TARGET)
                        end
                    end)
                end
            end
        end
    end

    self.Owner:FireBullets(bullet)
end

function SWEP:Reload()
    if self:Clip1() >= self.Primary.ClipSize then return end
    self:DefaultReload(ACT_SHOTGUN_RELOAD_START)
end
```