﻿# V1102\. Unreal Engine\. Violation of naming conventions may cause Unreal Header Tool to work incorrectly\.

Анализатор обнаружил объявление сущности, несоответствующей соглашениям о наименованиях для проектов, основанных на Unreal Engine\. Соответствие этому соглашению требуется для корректной работы Unreal Header Tool\.

**Примечание\.** Анализатор применяет диагностическое правило только на тех анализируемых файлах, в которых обнаружено включение заголовочных файлов из Unreal Engine\. Если вы хотите принудительно применить правило для произвольного файла, воспользуйтесь следующим [механизмом](https://pvs-studio.ru/ru/docs/manual/0040/#treat_as_unreal_engine_file)\.

Далее приведен перечень соглашений, поддерживаемых этим диагностическим правилом\.

Имена классов, наследуемых от 'UObject', следует начинать с префикса 'U':

```cpp
class USomeClass : public UObject
{
  ....
};
```

Имена классов, наследуемых от 'AActor', следует начинать с префикса 'A':

```cpp
class ASomeActor : public AActor
{
  ....
};
```

Имена классов, наследуемых от 'SWidget', следует начинать с префикса 'S':

```cpp
class SSomeWidget : public SWidget
{
  ....
};
```

Имена абстрактных классов / интерфейсов следует начинать с префикса 'I':

```cpp
class IAbstractClass
{
public:
  virtual void DoSmth() = 0;
};
```

Перечисления следует начинать с префикса 'E':

```cpp
enum class ESomeEnum
{
  ....
};
```

Имена шаблонов классов следует начинать с префикса 'T':

```cpp
template <typename T>
class TClassTemplate
{
  ....
};
```

Остальные классы следует начинать с префикса 'F':

```cpp
class FSimpleClass
{
  ....
};
```

Префикс типа и соответствующего ему псевдонима должны совпадать\. Псевдоним инстанцированного шаблона следует помечать как конкретную сущность:

```cpp
// usings
using UGameUIPolicy = USomeClass;
using AAIController = ASomeActor;  
using SActorCanvas  = SSomeWidget;  
using EColorBits    = ESomeEnum; 
using FArrowSlot    = FSimpleClass;

template <typename T>
using TMyArray = TClassTemplate<T>;

using FMyArrayFloat = TClassTemplate<float>;
using FMyArrayInt   = TMyArray<int>;

// typedefs
typedef USomeClass   UGameUIPolicy;
typedef ASomeActor   AAIController;
typedef SSomeWidget  SActorCanvas;
typedef ESomeEnum    EColorBits; 
typedef FSimpleClass FArrowSlot;

typedef TClassTemplate<int>   FMyArrayInt;
typedef TClassTemplate<float> FMyArrayFloat;
```

Анализатор будет выдавать предупреждение на любое нарушение указанных выше соглашений:

```cpp
class GameUIPolicy: public UObject { .... };

class BoxActor : public AActor { .... };

class WidgetButton : public SWidget { .... };

class Weapon
{
public:
  virtual void Shoot() = 0;
};

enum class Texture { .... };

class Enemy { .... };

template <typename T>
class DoubleLinkedList { .... };

typedef DoubleLinkedList<Enemy> EnemyList;
```

Исправленные примеры:

```cpp
class UGameUIPolicy: public UObject { .... };

class ABoxActor : public AActor { .... };

class SWidgetButton : public SWidget { .... };

class IWeapon
{
public:
  virtual void Shoot() = 0;
};

enum class ETexture { .... };

class FEnemy { .... };

template <typename T>
class TDoubleLinkedList { .... };

typedef DoubleLinkedList<Enemy> FEnemyList;
```