← Назад к вопросам
Как понять что код не готов для отправки на Code Review?
1.3 Junior🔥 122 комментариев
#JavaScript Core
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Признаки неготового кода к Code Review
Перед отправкой кода на проверку необходимо убедиться, что он соответствует стандартам качества. Есть чёткие критерии, по которым можно определить, что код не готов к review.
Технические недостатки
Самые очевидные проблемы - это нарушения синтаксиса и стиля:
// НЕПРАВИЛЬНО - console.log остался
function fetchData() {
console.log('DEBUG:', userData); // Должен быть удален!
return api.get('/users');
}
// НЕПРАВИЛЬНО - commented code
function processData(data) {
// let oldValue = data.id;
// console.log(oldValue);
return data.map(item => item.name);
}
// НЕПРАВИЛЬНО - временные переменные и магические числа
const checkAge = (age) => age > 18 ? true : false;
const TIMEOUT = 30000; // Что это значит? 30 секунд? 30 000 миллисекунд?
// ПРАВИЛЬНО - чистый код без отладки
function fetchData() {
return api.get('/users');
}
function checkAge(age) {
return age >= 18;
}
const REQUEST_TIMEOUT_MS = 30000; // Ясное имя с единицей измерения
Неправильная типизация и отсутствие тестов
В TypeScript-проекте код должен быть полностью типизирован:
// НЕПРАВИЛЬНО - любые типы
function processUser(user: any) {
return user.name.toUpperCase();
}
// НЕПРАВИЛЬНО - нет типов
const getData = (id) => {
return api.get(`/users/${id}`);
};
// ПРАВИЛЬНО - явная типизация
interface User {
id: string;
name: string;
email: string;
}
function processUser(user: User): string {
return user.name.toUpperCase();
}
async function getData(id: string): Promise<User> {
return api.get(`/users/${id}`);
}
Отсутствие тестов
Код без тестов - это код без гарантий:
// НЕПРАВИЛЬНО - нет тестов
export function calculateDiscount(price: number, percent: number): number {
return price * (100 - percent) / 100;
}
// ПРАВИЛЬНО - есть тесты
describe('calculateDiscount', () => {
it('should apply discount correctly', () => {
expect(calculateDiscount(100, 20)).toBe(80);
expect(calculateDiscount(50, 10)).toBe(45);
});
it('should handle edge cases', () => {
expect(calculateDiscount(0, 50)).toBe(0);
expect(calculateDiscount(100, 0)).toBe(100);
});
});
export function calculateDiscount(price: number, percent: number): number {
if (price < 0 || percent < 0) {
throw new Error('Price and percent must be non-negative');
}
return price * (100 - percent) / 100;
}
Нарушение структуры проекта
Код должен быть в правильном месте:
// НЕПРАВИЛЬНО - дефолт экспорт
// utils.ts
export default function formatDate(date) { ... }
// ПРАВИЛЬНО - именованный экспорт
// utils.ts
export function formatDate(date: Date): string { ... }
// НЕПРАВИЛЬНО - логика в компоненте
function UserProfile() {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(false);
// Много логики в компоненте
useEffect(() => {
api.get('/user').then(data => {
// Обработка, трансформация, валидация...
setUser(data);
});
}, []);
return <div>{user?.name}</div>;
}
// ПРАВИЛЬНО - логика в хуке
function useUser(id: string) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
fetchUser(id)
.then(setUser)
.catch(setError)
.finally(() => setLoading(false));
}, [id]);
return { user, loading, error };
}
function UserProfile({ id }: { id: string }) {
const { user, loading, error } = useUser(id);
if (loading) return <Skeleton />;
if (error) return <Error message={error.message} />;
return <div>{user?.name}</div>;
}
Отсутствие обработки ошибок
Код должен обрабатывать исключения:
// НЕПРАВИЛЬНО - нет обработки ошибок
async function saveUser(user: User) {
const response = await api.post('/users', user);
return response.data;
}
// ПРАВИЛЬНО - полная обработка
async function saveUser(user: User): Promise<User> {
try {
const response = await api.post('/users', user);
if (!response.ok) {
throw new Error(`Failed to save user: ${response.status}`);
}
return response.data;
} catch (error) {
console.error('Error saving user:', error);
throw error;
}
}
Лишние зависимости и большой бандл
// НЕПРАВИЛЬНО - много ненужных импортов
import { groupBy, unique, sum, map, filter } from 'lodash';
import moment from 'moment';
import axios from 'axios';
import fetch from 'node-fetch';
// ПРАВИЛЬНО - только необходимое
import { groupBy } from 'lodash';
import { api } from '@/lib/api';
Контрольный список готовности к Code Review
- Нет console.log, debugger, TODO без объяснения
- Все переменные имеют понятные имена (не a, b, temp)
- Код полностью типизирован (no any)
- Есть тесты с coverage >= 80%
- Нет дублированного кода (DRY принцип)
- Обработка всех возможных ошибок
- Нет закомментированного кода
- Соответствие стилю проекта
- Нет неиспользуемых импортов
- npm run lint проходит без ошибок
- npm run build успешен
- npm run test все зелёные
- Commit messages понятные и информативные
Если хотя бы один пункт не выполнен, код необходимо доработать перед отправкой на review. Качественный code review требует качественного кода на входе.