Coding Standards & Best Practices (docs-tr)
Улучшите качество кода с помощью навыка coding-standards для Claude Code. Лучшие практики разработки на TypeScript, React и Node.js.
Этот навык выступает в роли автоматизированного архитектора и наставника, предоставляя всесторонние рекомендации по современной веб-разработке. Он обеспечивает соблюдение фундаментальных принципов программной инженерии, таких как KISS, DRY и YAGNI, а также предлагает конкретные шаблоны реализации для типовой безопасности TypeScript, архитектуры компонентов React и проектирования RESTful API. Независимо от того, создаете ли вы новый проект с нуля или рефакторите устаревший код, этот навык гарантирует структурную согласованность, улучшает читаемость и минимизирует технический долг с помощью проверенных отраслевых шаблонов и стратегий разработки, ориентированных на производительность.
Ключевые возможности
Примеры использования
| name | coding-standards |
|---|---|
| description | TypeScript, JavaScript, React ve Node.js geliştirme için evrensel kodlama standartları, en iyi uygulamalar ve kalıplar. |
| origin | ECC |
Tüm projelerde uygulanabilir evrensel kodlama standartları.
- Yeni bir proje veya modül başlatırken
- Kod kalitesi ve sürdürülebilirlik için kod incelerken
- Mevcut kodu kurallara uygun hale getirmek için refactor ederken
- İsimlendirme, biçimlendirme veya yapısal tutarlılığı zorunlu kılarken
- Linting, biçimlendirme veya tür kontrolü kuralları ayarlarken
- Yeni katkıda bulunanları kodlama kurallarına alıştırırken
- Kod yazılmaktan çok okunur
- Net değişken ve fonksiyon isimleri
- Yorumlardan çok kendi kendini belgeleyen kod tercih edilir
- Tutarlı biçimlendirme
- Çalışan en basit çözüm
- Aşırı mühendislikten kaçının
- Erken optimizasyon yapmayın
- Anlaşılır kod > akıllıca kod
- Ortak mantığı fonksiyonlara çıkarın
- Yeniden kullanılabilir bileşenler oluşturun
- Yardımcı araçları modüller arasında paylaşın
- Kopyala-yapıştır programlamadan kaçının
- İhtiyaç duyulmadan özellikler oluşturmayın
- Spekülatif genellemeden kaçının
- Karmaşıklığı sadece gerektiğinde ekleyin
- Basit başlayın, gerektiğinde refactor edin
// PASS: İYİ: Açıklayıcı isimler
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000
// FAIL: KÖTÜ: Belirsiz isimler
const q = 'election'
const flag = true
const x = 1000// PASS: İYİ: Fiil-isim kalıbı
async function fetchMarketData(marketId: string) { }
function calculateSimilarity(a: number[], b: number[]) { }
function isValidEmail(email: string): boolean { }
// FAIL: KÖTÜ: Belirsiz veya sadece isim
async function market(id: string) { }
function similarity(a, b) { }
function email(e) { }// PASS: HER ZAMAN spread operatörü kullanın
const updatedUser = {
...user,
name: 'New Name'
}
const updatedArray = [...items, newItem]
// FAIL: ASLA doğrudan mutasyon yapmayın
user.name = 'New Name' // KÖTÜ
items.push(newItem) // KÖTÜ// PASS: İYİ: Kapsamlı hata yönetimi
async function fetchData(url: string) {
try {
const response = await fetch(url)
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
}
return await response.json()
} catch (error) {
console.error('Fetch failed:', error)
throw new Error('Failed to fetch data')
}
}
// FAIL: KÖTÜ: Hata yönetimi yok
async function fetchData(url) {
const response = await fetch(url)
return response.json()
}// PASS: İYİ: Mümkün olduğunda paralel yürütme
const [users, markets, stats] = await Promise.all([
fetchUsers(),
fetchMarkets(),
fetchStats()
])
// FAIL: KÖTÜ: Gereksiz yere sıralı
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()// PASS: İYİ: Doğru tipler
interface Market {
id: string
name: string
status: 'active' | 'resolved' | 'closed'
created_at: Date
}
function getMarket(id: string): Promise<Market> {
// Implementation
}
// FAIL: KÖTÜ: 'any' kullanımı
function getMarket(id: any): Promise<any> {
// Implementation
}// PASS: İYİ: Tiplerle fonksiyonel bileşen
interface ButtonProps {
children: React.ReactNode
onClick: () => void
disabled?: boolean
variant?: 'primary' | 'secondary'
}
export function Button({
children,
onClick,
disabled = false,
variant = 'primary'
}: ButtonProps) {
return (
<button
onClick={onClick}
disabled={disabled}
className={`btn btn-${variant}`}
>
{children}
</button>
)
}
// FAIL: KÖTÜ: Tip yok, belirsiz yapı
export function Button(props) {
return <button onClick={props.onClick}>{props.children}</button>
}// PASS: İYİ: Yeniden kullanılabilir özel hook
export function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => clearTimeout(handler)
}, [value, delay])
return debouncedValue
}
// Kullanım
const debouncedQuery = useDebounce(searchQuery, 500)// PASS: İYİ: Doğru state güncellemeleri
const [count, setCount] = useState(0)
// Önceki state'e dayalı fonksiyonel güncelleme
setCount(prev => prev + 1)
// FAIL: KÖTÜ: Doğrudan state referansı
setCount(count + 1) // Async senaryolarda eski olabilir// PASS: İYİ: Açık koşullu render
{isLoading && <Spinner />}
{error && <ErrorMessage error={error} />}
{data && <DataDisplay data={data} />}
// FAIL: KÖTÜ: Ternary cehennemi
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}GET /api/markets # Tüm marketleri listele
GET /api/markets/:id # Belirli marketi getir
POST /api/markets # Yeni market oluştur
PUT /api/markets/:id # Marketi güncelle (tam)
PATCH /api/markets/:id # Marketi güncelle (kısmi)
DELETE /api/markets/:id # Marketi sil
# Filtreleme için query parametreleri
GET /api/markets?status=active&limit=10&offset=0
// PASS: İYİ: Tutarlı response yapısı
interface ApiResponse<T> {
success: boolean
data?: T
error?: string
meta?: {
total: number
page: number
limit: number
}
}
// Başarılı response
return NextResponse.json({
success: true,
data: markets,
meta: { total: 100, page: 1, limit: 10 }
})
// Hata response
return NextResponse.json({
success: false,
error: 'Invalid request'
}, { status: 400 })import { z } from 'zod'
// PASS: İYİ: Schema doğrulama
const CreateMarketSchema = z.object({
name: z.string().min(1).max(200),
description: z.string().min(1).max(2000),
endDate: z.string().datetime(),
categories: z.array(z.string()).min(1)
})
export async function POST(request: Request) {
const body = await request.json()
try {
const validated = CreateMarketSchema.parse(body)
// Doğrulanmış veriyle devam et
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json({
success: false,
error: 'Validation failed',
details: error.errors
}, { status: 400 })
}
}
}src/
├── app/ # Next.js App Router
│ ├── api/ # API routes
│ ├── markets/ # Market sayfaları
│ └── (auth)/ # Auth sayfaları (route groups)
├── components/ # React bileşenleri
│ ├── ui/ # Genel UI bileşenleri
│ ├── forms/ # Form bileşenleri
│ └── layouts/ # Layout bileşenleri
├── hooks/ # Özel React hooks
├── lib/ # Yardımcı araçlar ve konfigürasyonlar
│ ├── api/ # API istemcileri
│ ├── utils/ # Yardımcı fonksiyonlar
│ └── constants/ # Sabitler
├── types/ # TypeScript tipleri
└── styles/ # Global stiller
components/Button.tsx # Bileşenler için PascalCase
hooks/useAuth.ts # 'use' öneki ile camelCase
lib/formatDate.ts # Yardımcı araçlar için camelCase
types/market.types.ts # .types soneki ile camelCase
// PASS: İYİ: NİÇİN'i açıklayın, NE'yi değil
// Kesintiler sırasında API'yi aşırı yüklemekten kaçınmak için exponential backoff kullan
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)
// Büyük dizilerle performans için burada kasıtlı olarak mutasyon kullanılıyor
items.push(newItem)
// FAIL: KÖTÜ: Açık olanı belirtmek
// Sayacı 1 artır
count++
// İsmi kullanıcının ismine ayarla
name = user.name/**
* Semantik benzerlik kullanarak market arar.
*
* @param query - Doğal dil arama sorgusu
* @param limit - Maksimum sonuç sayısı (varsayılan: 10)
* @returns Benzerlik skoruna göre sıralanmış market dizisi
* @throws {Error} OpenAI API başarısız olursa veya Redis kullanılamazsa
*
* @example
* ```typescript
* const results = await searchMarkets('election', 5)
* console.log(results[0].name) // "Trump vs Biden"
* ```
*/
export async function searchMarkets(
query: string,
limit: number = 10
): Promise<Market[]> {
// Implementation
}import { useMemo, useCallback } from 'react'
// PASS: İYİ: Pahalı hesaplamaları memoize et
const sortedMarkets = useMemo(() => {
return markets.sort((a, b) => b.volume - a.volume)
}, [markets])
// PASS: İYİ: Callback'leri memoize et
const handleSearch = useCallback((query: string) => {
setSearchQuery(query)
}, [])import { lazy, Suspense } from 'react'
// PASS: İYİ: Ağır bileşenleri lazy yükle
const HeavyChart = lazy(() => import('./HeavyChart'))
export function Dashboard() {
return (
<Suspense fallback={<Spinner />}>
<HeavyChart />
</Suspense>
)
}// PASS: İYİ: Sadece gerekli sütunları seç
const { data } = await supabase
.from('markets')
.select('id, name, status')
.limit(10)
// FAIL: KÖTÜ: Her şeyi seç
const { data } = await supabase
.from('markets')
.select('*')test('benzerliği doğru hesaplar', () => {
// Arrange (Hazırla)
const vector1 = [1, 0, 0]
const vector2 = [0, 1, 0]
// Act (İşle)
const similarity = calculateCosineSimilarity(vector1, vector2)
// Assert (Doğrula)
expect(similarity).toBe(0)
})// PASS: İYİ: Açıklayıcı test isimleri
test('sorguya uygun market bulunamadığında boş dizi döndürür', () => { })
test('OpenAI API anahtarı eksikse hata fırlatır', () => { })
test('Redis kullanılamazsa substring aramaya geri döner', () => { })
// FAIL: KÖTÜ: Belirsiz test isimleri
test('çalışır', () => { })
test('arama testi', () => { })Bu anti-kalıplara dikkat edin:
// FAIL: KÖTÜ: 50 satırdan uzun fonksiyon
function processMarketData() {
// 100 satır kod
}
// PASS: İYİ: Küçük fonksiyonlara böl
function processMarketData() {
const validated = validateData()
const transformed = transformData(validated)
return saveData(transformed)
}// FAIL: KÖTÜ: 5+ seviye iç içe geçme
if (user) {
if (user.isAdmin) {
if (market) {
if (market.isActive) {
if (hasPermission) {
// Bir şeyler yap
}
}
}
}
}
// PASS: İYİ: Erken dönüşler
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return
// Bir şeyler yap// FAIL: KÖTÜ: Açıklanmamış sayılar
if (retryCount > 3) { }
setTimeout(callback, 500)
// PASS: İYİ: İsimlendirilmiş sabitler
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500
if (retryCount > MAX_RETRIES) { }
setTimeout(callback, DEBOUNCE_DELAY_MS)Unutmayın: Kod kalitesi pazarlık konusu değildir. Açık, sürdürülebilir kod hızlı geliştirme ve güvenli refactoring sağlar.
🎯 Что это
Coding Standards & Best Practices — это набор универсальных правил, шаблонов и рекомендаций для написания чистого, читаемого и поддерживаемого кода на TypeScript, JavaScript, React и Node.js. Навык основан на многолетнем опыте продакшн-разработки и предназначен для всей команды: от новичков до тимлидов.
Он помогает задать единый стандарт в проекте, избавляет от споров «а как писать?» и автоматизирует контроль качества ревью. Если вы начинаете новый модуль, рефакторите легаси или настраиваете линтер — этот навык станет вашим чек-листом.
⚙️ Как работает
📌 Основные принципы
- Readability First (Читаемость превыше всего): код пишется один раз, читается десятки раз. Понятные имена переменных, функций, самодокументируемый код без лишних комментариев.
- KISS (Keep It Simple): выбирайте самое простое работающее решение. Не усложняйте преждевременной оптимизацией или абстракциями.
- DRY (Don't Repeat Yourself): выносите повторяющуюся логику в функции, хелперы и переиспользуемые компоненты. Копипаст — зло.
- YAGNI (You Aren't Gonna Need It): не пишите код для гипотетических будущих сценариев. Добавляйте сложность только когда она реально понадобится.
🏷️ Именование
- Переменные:
marketSearchQuery,isUserAuthenticated,totalRevenue— описательные имена, безq,flag,x. - Функции: глагол + существительное —
fetchMarketData,calculateSimilarity,isValidEmail. Не простоmarket,similarity. - Компоненты: PascalCase —
Button.tsx,UserProfile.tsx. - Хуки:
use+ camelCase —useAuth,useDebounce. - Файлы:
hooks/useAuth.ts,lib/formatDate.ts,types/market.types.ts.
❌ Иммутабельность (критично!)
Всегда используйте spread-оператор для обновления объектов и массивов. Никогда не мутируйте напрямую:
# ✅ Правильно
const updatedUser = { ...user, name: 'New Name' }
const updatedArray = [ ...items, newItem ]
# ❌ Неправильно
user.name = 'New Name'
items.push(newItem)
⚠️ Обработка ошибок
Все асинхронные вызовы должны быть обёрнуты в try/catch. Ошибки логируются, пользователю возвращается осмысленное сообщение. Пустой catch без обработки или отсутствие try/catch — код-смрад.
⚡ Async/Await
Сводите последовательные await к минимуму. Если запросы независимы — запускайте их параллельно через Promise.all:
# ✅ Параллельно (быстро)
const [users, markets, stats] = await Promise.all([
fetchUsers(),
fetchMarkets(),
fetchStats()
])
# ❌ Последовательно (медленно)
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()
🧷 Типобезопасность
Избегайте any. Для каждого API-ответа, пропсов компонента и модели данных объявляйте интерфейсы и типы. Используйте union-типы для конечных значений (статусы, варианты).
🧩 React-специфика
- Компоненты: функциональные с явным типом пропсов (не
props). - Хуки: выносите сложную логику в кастомные хуки (
useDebounce,useLocalStorage). - State: используйте функциональную форму обновления (
setCount(prev => prev + 1)) в асинхронных сценариях. - Условный рендеринг: предпочитайте
&&и отдельные блокиifглубокой вложенности тернарников. - Мемоизация:
useMemoдля тяжёлых вычислений,useCallbackдля стабильных ссылок функций. - Lazy loading: тяжёлые компоненты подгружайте лениво через
React.lazy+Suspense.
🔌 API-стандарты
- REST: единый стиль URL (
/api/markets/:id), правильное использование HTTP-методов (GET, POST, PUT, PATCH, DELETE). - Response: обязательная обёртка
ApiResponseT`` с полямиsuccess,data,error,meta. - Валидация: входные данные проверяются через Zod (или аналоги) перед обработкой.
🗂️ Организация проекта
Рекомендуемая структура папок и файлов (пример для Next.js App Router):
src/
├── app/ # Маршруты и страницы
│ ├── api/ # API-роуты
│ ├── markets/ # Страницы рынков
│ └── (auth)/ # Группа маршрутов авторизации
├── components/ # UI-компоненты
├── hooks/ # Кастомные хуки
├── lib/ # Хелперы, клиенты API, константы
├── types/ # TypeScript-типы
└── styles/ # Глобальные стили
🧪 Тестирование
- AAA (Arrange-Act-Assert): подготовка → действие → проверка.
- Имена тестов: описывают, что проверяется (
'returns empty array when no market found'), а не'works'. - Покрытие граничных кейсов: ошибки сети, пустые ответы, невалидные данные.
🚨 Антипаттерны (код-смрад)
- Длинные функции (>50 строк) — разбивайте на маленькие шаги.
- Глубокая вложенность (>4 уровня) — используйте ранние return и guard-клаузы.
- Магические числа — выносите в именованные константы (
MAX_RETRIES = 3,DEBOUNCE_DELAY_MS = 500). - Мутация вместо иммутабельности — приводит к неожиданным багам в React.
💬 Комментарии
Комментируйте почему (бизнес-логика, причина хака), а не что делает код. Для публичных API используйте JSDoc с @param, @returns, @throws, @example.
✅ Когда использовать
- Старт нового проекта: сразу применить стандарт, чтобы кодовая база была чистой с первого коммита.
- Code Review: проверять пул-реквесты на соответствие этим правилам — быстрее, чем объяснять одно и то же устно.
- Рефакторинг: при переписывании легаси следовать стандарту, чтобы не плодить старые ошибки.
- Онбординг: познакомить нового разработчика с правилами команды.
- Настройка тулинга: как основа для конфигурации ESLint, Prettier, TypeScript strict mode.
💡 Важно знать
- Навык не привязан к конкретному фреймворку или библиотеке, но ориентирован на TypeScript/React/ Next.js стек. Для других языков потребуется адаптация имён (например,
snake_caseдля Python). - Правило «Никакой мутации» — строжайшее. Если вам очень нужно изменить объект на месте (например, для производительности с огромными массивами), оставьте комментарий с обоснованием.
- Единый стиль важнее «правильного» стиля. Договоритесь в команде и следуйте соглашению везде. Этот набор — отличная отправная точка.
Стандарт основан на многолетнем опыте, принципах SOLID и Clean Code. Дополняйте его под свой проект, но не отступайте от базовых принципов читаемости и простоты.
Помогает ли этот навык с оптимизацией производительности?
Да, он включает шаблоны для мемоизации в React, ленивой загрузки и эффективного выбора запросов к базе данных для обеспечения высокой производительности приложений.
Как он работает с разработкой API?
Он предоставляет стандартизированный подход к маршрутизации REST API, единообразные форматы JSON-ответов и схемную валидацию с помощью Zod.
Может ли он помочь с модульным тестированием?
Да, он обеспечивает соблюдение шаблона AAA (Arrange, Act, Assert) и предоставляет соглашения об именовании для описательных и надежных тестовых наборов.
Какие фреймворки охватываются этими стандартами?
Этот навык предоставляет конкретные рекомендации для проектов на TypeScript, JavaScript, React, Node.js и Next.js.
Синхронизируйте навыки с Claude Cowork, Claude Code, Codex и другими.
Установка одной командой.
npx skillfish add affaan-m/everything-claude-code coding-standardsИсточник: https://mcpmarket.com/tools/skills/coding-standards-best-practices-docs-tr
Комментарии
Комментариев пока нет. Будьте первым.