Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14

C#.NStar

22.11.2020, 01:26. Показов 40251. Ответов 523
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С чего всё началось
Мой язык программирования развивается, в очередной раз меняя название. Пятое название после C↑ᶜC, C#++, C with stations и временного Unnamed2 имеет вид "C# .NStar". Это название не вызывает никаких ассоциаций со стрелками, с "симбиозом плюсов и шарпа", со "станционным программированием", а вызывает единственную - то, что этот язык - прямое продолжение C#. Теперь вы убедились, что этот язык - не пустая болтовня, одна версия уже увидела свет, поэтому надеюсь, что очередная презентация возможностей C# .NStar хоть и подвергнется критике, но не приведет ни к чему плохому. Вот что уже работает:
1. Пространства имен.
2. Ошибки списком строк - теперь отображение n ошибок не займет время, пропорциональное n2, и вообще я по максимуму убрал конкатенацию строк в цикле, что является экстремально важным признаком качества языка.
3. Списки - не только возврат списка, но и переменные списочных типов.
4. Индексы - последний и самый сложный из перечисленных пунктов. Такой код успешно работает:
Code
1
2
list(3) int a = (((1, 2, 3), (4, 5, 6), (7, 8, 9)), ((10, 11, 12), (13, 14, 15), (16, 17, 18)), ((19, 20, 21), (22, 23, 24), (25, 26, 27)));
return a[1, 2, 3];
Но для того, чтобы выложить версию, этого мало. Это просто презентация.
А вот несколько будущих возможностей:
1. Оператор switch с лямбда-выражением. Это невероятно мощная конструкция! Позволит убрать очень много дублирования в условиях. Вот два примера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (task.StartsWith("Class "))
{
    return Action1(task.Substring("Class ".Length));
}
else if (task.StartsWith("Interface "))
{
    return Action2(task.Substring("Interface ".Length));
}
else if (task.StartsWith("Function "))
{
    return Action3(task.Substring("Function ".Length));
}
else if (task.StartsWith("Extent "))
{
    return Action4(task.Substring("Extent ".Length));
}
...
Code
1
2
3
4
5
6
7
8
return x => task == x + string s switch
{
    "Class " => Action1(s);
    "Interface " => Action2(s);
    "Function " => Action3(s);
    "Extent " => Action4(s);
    ...
};
Прошу обратить особое внимание на огромную мощь этой конструкции и написать, хотели бы вы ею воспользоваться или нет, и если нет, то почему.
2. Способ задания словаря будет отличаться от способа задания двумерного списка: ключ и значение будут разделяться оператором ":", а если словарь состоит из единственного элемента, доступного по всем ключам - достаточно указать один этот элемент. Пример:
Code
1
2
Dictionary[string, int] dic1 = ("Съешь": 1, "же": 2, "ещё": 3, "этих": 4, "мягких": 5, "французских": 6, "булок": 7, "да": 8, "выпей": 9, "чаю": 10, _: 0);
Dictionary[string, int] dic2 = -12345;
3. Оператор ![], позволяющий сменить внутренний тип коллекции без смены внешнего типа. Это позволит создать аналог LINQ нового поколения - Jaretorant, в котором не надо завершать каждое выражение функциями ToArray() или ToList(). Только посмотрите:
Code
1
2
3
4
() int oldList;
() real newList = oldList.TransformEach(x => 1r / x);
LinkedList[int] oldList2;
LinkedList[real] newList2 = oldList2.TransformEach(x => 1r / x);
А сама конструкция TransformEach записывается таким способом:
Code
1
2
3
4
5
6
7
8
9
10
Dictionary[(typename TSource, typename TCollection : IEnumerable[TSource], typename TDest), TCollection![TDest] Extent(TCollection source, Func[TDest, TSource] Transformator)] =
{
    TCollection![TDest] output = new TDest[source.Count()];
    int i = 0;
    for (TSource elem in source)
    {
        output[i++] = Transformator(elem);
    }
    return output;
}
P. S. Недавно я наткнулся на список торговых знаков Microsoft. Оказывается, там написано, что нельзя искажать, модифицировать или комбинировать с любыми словами, символами, изображениями или другими видами информации любые из этих торговых знаков. Но самих знаков немного: само слово "Microsoft", Windows, MSN, Bing, Skype, Microsoft Edge и еще один или два. C# там нет! Поэтому создать язык с названием C# .NStar мне ничего не мешает.


 Комментарий модератора 
Update от 09.02.2026


ПОБЕДА!!! C#.NStar достиг версии (Alpha RC) 0.9! Это первое приложение от Red-Star-Soft, когда-либо достигавшее подобной версии! (Фреймворк - это не приложение.) Теперь, надеюсь, я перестал быть "профессиональным недоделывателем"? И, надеюсь, я получу тест?
1. Работа с файлами.
2. При техническом крахе сохраняется лог во временную папку.
3. Потоки. Причем нет этого ужасного разбиения на две воюющих стороны - синхронные и асинхронные - переключение контекста происходит автоматически.
4. "Швейцарский нож" (оператор is, сопоставление шаблонов). Пока что реализованы семь шаблонов: константа, тип, тип с объявлением переменной, var с объявлением переменной, шаблон сравнения (больше/меньше), пустой шаблон (_) и составной шаблон - несколько шаблонов, объединенных операторами and, or, not. Есть одна замеченная, но не исправленная ошибка, что попытка применить шаблон сравнения не к числу вызывает технический крах. Возможно, в будущем исправлю.
5. Сокращенный оператор for - можно написать так:
Code
1
2
3
4
for (i in collection)
{
    ...
}
- или так:
Code
1
2
3
4
for (i in a..b)
{
    ...
}
6. Сокращенные константы - если есть ключевое слово const, необзательно писать var или тем более полный тип.
7. Записи (Record - с прописной буквы). В отличие от C#.NET, это по терминологии Мартина чистые структуры данных, имеющие свойства, совпадащие по именам и типам с параметрами, конструктор из эих параметров и стандартные методы Equals и GetHashCode и неспособные иметь другие методы и свойства.
8. Структуры (Struct - с прописной буквы).
9. Прототип полиморфизма в виде словарей от рекурсивного типа к классу, одним из следующих способов (ключевое слово Class в случае полиморфизма обязтельно брать в скобки):
Code
1
2
3
4
const [typename T, (Class)] ClassName = new(
{
    ...
});
Code
1
2
3
4
const ClassName = new [typename T, (Class)](
{
    ...
});
Code
1
2
3
4
const var ClassName = new [typename T, (Class)](
{
    ...
});
Code
1
2
3
4
const [typename T, (Class)] ClassName = new [typename T, (Class)](
{
    ...
});
Code
1
2
3
4
const [typename T : BaseType, (Class : BaseType2)] ClassName = new(
{
    ...
});
Code
1
2
3
4
const ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});
Code
1
2
3
4
const var ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});
Code
1
2
3
4
const [typename T : BaseType, (Class : BaseType2)] ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});
Словари от чисел, строк или других типов, кроме typename, пока лучше даже не пытаться создавать - они не работают!
10. Обработка исключений:
Code
1
2
3
4
5
6
7
8
try
{
    ...
}
catch (ExceptionType var) if (condition) // if, а не when
{
    ...
}
В текущей версии доступен базовый набор исключений: Exception, ArgumentException (включает в себя ArgumentNullException и ArgumentOutOfRangeException, хотя явно указать их нельзя), IndexOutOfRangeException, InvalidOperationException, NullReferenceException и IOException.
11. И самое невероятное - ПАКЕТНЫЙ МЕНЕДЖЕР!!! Вы можете подключить любой пакет, доступный в публичном репозитории NuGet - достаточно зайти в настройки и указать его имя.
Рабочие примеры кода на C#.NStar, в дополнение к предыдущим версиям:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Threading;
Class MyClass
{
    Constructor()
    {
    }
    int Function Sync()
    {
        var x = MyClass2.MyFunc(5);
        return x;
    }
    Task[int] Function Async1()
    {
        var x = MyClass2.MyFunc(5);
        return x;
    }
    Task[int] Function Async2(int n)
    {
        return n * n;
    }
}
 
static Class MyClass2
{
    Func[Task[int], int] MyFunc = new MyClass().Async2;
}
 
return new MyClass().Async1();
Code
1
2
3
object item = "Welcome!";
if (item is string text)
    return text;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
abstract Class BaseStack
{
    required typename T { get, init };
    
    abstract T Function Peek();
    abstract T Function Pop();
    abstract null Function Push(T item);
}
 
const [typename T, (Class : BaseStack[T])] Stack = new(
{
    private () T list = new(32);
 
    T Function Peek()
    {
        return list[^1];
    }
 
    T Function Pop
    {
        return list.GetAndRemove(list.Length - 1);
    }
 
    null Function Push(T item)
    {
        list.Add(item);
    }
});
 
BaseStack[int] intStack = new Stack[int]();
intStack.Push(5);
intStack.Push(10);
var x = (intStack.Pop(), intStack.Peek());
BaseStack[string] stringStack = new Stack[string]();
stringStack.Push("A");
stringStack.Push("B");
var y = (stringStack.Pop(), stringStack.Peek());
return (x, y);
Code
1
2
3
4
5
6
() int list = new();
for (i in Chain(0, 10)) while (i * i % 20 < 10)
{
    list.Add(i);
}
return list;
Code
1
2
3
4
5
6
int n = 0;
for (i in 1..1000)
{
    n++;
}
return n;
Code
1
2
3
Record Pair(string Name, int Value);
Pair pair = new("Status", 100);
return pair;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const [typename T : IComparable[T], (Class)] Repository = new(
{
    private () T items = new();
 
    null Function Add(T item)
    {
        items.Add(item);
    }
 
    T Function GetMax()
    {
        if (items.Length == 0)
            return null;
        return Max(items);
    }
});
 
Class Product : IComparable[Product]
{
    int Id;
    int Function CompareTo(Product product)
    {
        return Id.CompareTo(product.Id);
    }
}
 
var repo = new Repository[Product]();
repo.Add(new Product[1]());
repo.Add(new Product[5]());
return repo.GetMax().Id;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.IO;
try
{
    () int list = (1, 2, 3);
    return list.IndexOf(1, 5);
}
catch (ex) if (ex is not ArgumentException)
{
    return 1;
}
catch (ex)
{
    return "" + ex.Message;
}
return 2;
P. S. Можно также скачать из облаков, ссылка на странице версии.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2020, 01:26
Ответы с готовыми решениями:

Мелкомягкие мыслят местами точно как и я или следят за моим компьютером и крадут идеи, записанные на нем для C# .NStar?
Кто знает? Вот неполная цитата из файла, созданного в феврале этого года: А тут оказывается, что...

Стал ли .NStar в меньшей степени "сборной солянкой"?
sau, это тема для вас! Хотя обоснованные, не содержащие трёпа и троллинга мнения других...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
523
42 / 49 / 6
Регистрация: 21.10.2022
Сообщений: 658
Записей в блоге: 2
21.11.2025, 11:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Тут спорно. А если кто-то укажет миллион? Нет, мне кажется, достаточно нескольких уровней строгости, например Strict (10), Normal (16), Lite (25), UltraLite (50), ну и Disable, чтобы полностью отключить, плюс подавление на уровне отдельных классов.
Тут спорно. Зачем вообще это делать? Зачем вводить бессмысленные сущности?
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 11:55
Под программой вы понимаете минимодуль? Но это решается иными средствами а не количеством классов в модуле. Какая то каша. я так понимаю вы это так интерпретируете то что называется «слабое связывание» (Low Coupling) и «высокое сопряжение» (High Cohesion) и не только.... точнее даже напоминает результат каши от своей интерпретации хороших практик программирования.


Навертеть фигни то можно и на 8 классах .....
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 11:59  [ТС]
Цитата Сообщение от didgik Посмотреть сообщение
Зачем вводить бессмысленные сущности?
Мне они не кажутся бессмысленными.
Цитата Сообщение от voral Посмотреть сообщение
Под программой вы понимаете минимодуль?
Там же написано, 8 классов на программу - это временно, в будущем будет 8 классов на сборку.
Цитата Сообщение от voral Посмотреть сообщение
Но это решается иными средствами а не количеством классов в модуле.
Какими, например?
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:08
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Там же написано, 8 классов на программу - это временно, в будущем будет 8 классов на сборку.
Понятнее не стало... у вас где то есть перевод на нормальный язык: что такое сборка?
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Какими, например?
Ну для начала надо понять что вы хотите.

А так, разумной расстановкой модификаторов доступа, разделение на модули/библиотеки с созданием интерфейсов для взаимодействия. Тут речь идет ведь об архиетктуре. Что приходит в голову (для того чтобы немного разделить ваше понятие "спаггети-связи"

1 Слабая связанность (Low Coupling)
2 Высокое зацепление (High Cohesion)
3 Инверсия зависимостей (Dependency Inversion)
4 Внедрение зависимостей (Dependency Injection)

Использование некоторых паттернов

И признаком нарушения всего этого является не количество классов. Надо анализировать архитектуру и связи. в 8 классах (и даже в меньшем количестве) можно все четыре пункта нарушить создав неадекватный клубок кода.
0
Эксперт .NET
 Аватар для Usaga
14790 / 9564 / 1367
Регистрация: 21.01.2016
Сообщений: 36,060
21.11.2025, 12:11
Цитата Сообщение от voral Посмотреть сообщение
что такое сборка?
Это название DLL (или проекта для DLL). Терминология из мира .NET.
1
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:13
Вот я попросил ИИ накидать пример (я на шарпе не писал, потому делегировал
Всего 3 класса. Вы этот код считаете хорошим и не спаггети?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public class User
{
    public string Name { get; set; }
    private string _password = "secret";
    
    public void PurchaseProduct(string productName)
    {
        Order order = new Order();
        order.ProcessOrder(this, productName); 
        
        DatabaseManager db = new DatabaseManager();
        db.SavePurchase(this.Name, productName);
        
        if (order.GetInternalStatus() == "failed")
        {
            EmailService email = new EmailService();
            email.SendErrorEmail(this, "Purchase failed");
        }
    }
    
    internal string GetPrivatePassword()
    {
        return _password;
    }
}
 
public class Order
{
    private string _internalStatus = "processing";
    
    public void ProcessOrder(User user, string product)
    {
        string userSecret = user.GetPrivatePassword();
        
        DatabaseManager db = new DatabaseManager();
        db.ValidateUser(user.Name, userSecret);
        
        if (user.Name == "Admin")
        {
            _internalStatus = "priority";
        }
        
        EmailService email = new EmailService();
        email.SendOrderConfirmation(user, this, product);
        
        user.PurchaseProduct("additional item");
    }
    
    public string GetInternalStatus()
    {
        return _internalStatus;
    }
}
 
public class EmailService
{
    public void SendOrderConfirmation(User user, Order order, string product)
    {
        string status = order.GetInternalStatus();
        
        string userSecret = user.GetPrivatePassword(); 
        
        DatabaseManager db = new DatabaseManager();
        db.LogEmail(user.Name, product);
        
        Console.WriteLine($"Email to {user.Name}: Your {product} order is {status}");
        Console.WriteLine($"PS: Your password is {userSecret}"); 
    }
    
    public void SendErrorEmail(User user, string error)
    {
        DatabaseManager db = new DatabaseManager();
        db.LogError(user.Name, error);
    }
}
 
public class DatabaseManager
{
    public void SavePurchase(string userName, string product)
    {
        Console.WriteLine($"Saved purchase: {userName} bought {product}");
    }
    
    public void ValidateUser(string userName, string password)
    {
        Console.WriteLine($"Validating user {userName} with password {password}");
    }
    
    public void LogEmail(string userName, string product)
    {
        Console.WriteLine($"Logged email for {userName} about {product}");
    }
    
    public void LogError(string userName, string error)
    {
        Console.WriteLine($"Logged error for {userName}: {error}");
    }
}
 
public class Program
{
    public static void Main()
    {
        User user = new User { Name = "John" };
        user.PurchaseProduct("Laptop");
    }
}
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 12:27  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Понятнее не стало... у вас где то есть перевод на нормальный язык: что такое сборка?
В Visual Studio это называется "проект", но я считаю это название неверным. Проект - это вся программа, или весь фреймворк, где могут быть сотни сборок и десятки решений.
Цитата Сообщение от voral Посмотреть сообщение
Надо анализировать архитектуру и связи.
Согласен, но не знаю, насколько это реально для инди-разработчика, аналог PVS-Studioя точно не напишу.
Цитата Сообщение от voral Посмотреть сообщение
Всего 3 класса.
Вообще-то 4, не считая Program.
Цитата Сообщение от voral Посмотреть сообщение
Вы этот код считаете хорошим и не спаггети?
Не идеальный, но как набросок пойдет. Классы соответствуют своему названию, не являются божественными (возможно, временно, пока набросок), только разве что DatabaseManager лишний, слово Manager - антипаттерн, можно было бы его методы разбросать по другим классам. Остальные классы хорошие.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Это название DLL (или проекта для DLL).
Не обязательно, может быть и EXE, если приложение многопроцессное.
0
Эксперт .NET
 Аватар для Usaga
14790 / 9564 / 1367
Регистрация: 21.01.2016
Сообщений: 36,060
21.11.2025, 12:28
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
если приложение многопроцессное.
"Многопроцессное"?
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:34
Что вы тогда называете спаггети - можете описать в чем оно проявляется?

Например: Разве хорошо что класс User жестко зависит от классов Order, DatabaseManger, MailSerivce?

Добавлено через 2 минуты
Особенно если в MailService куда то еще докинуть (скажем бизнеслогика какая то потребуется связанная с пользователем)
C#
1
2
 
        User defaultUser = new User { Name = "Default" };
Добавлено через 59 секунд
В любом случае - количество классов не показатель. Как раз таки модуль содержащий 16 классов может оказаться более "чистым" чем тот же модуль с тем же функционалом из 5 классов
0
Эксперт .NET
 Аватар для Usaga
14790 / 9564 / 1367
Регистрация: 21.01.2016
Сообщений: 36,060
21.11.2025, 12:34
Цитата Сообщение от voral Посмотреть сообщение
Разве хорошо что класс User жестко зависит от классов Order, DatabaseManger, MailSerivce?
Зависит от ситуации. Тут нет однозначного ответа. Потому, твой ЯП не может за программиста что-то в этом вопросе решать.
1
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 12:36  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Что вы тогда называете спаггети - можете описать в чем оно проявляется?
Это когда "нишевые" классы зависят от ключевых, например, в случае игры - оружие врага от игрока или главного контроллера игры.
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:38
Цитата Сообщение от Usaga Посмотреть сообщение
Зависит от ситуации. Тут нет однозначного ответа. Потому, твой ЯП не может за программиста что-то в этом вопросе решать.
Это понятно. но по мне так захардкоженная привязка к другим классам это более серьезный признак плохого кода нежели количество классов. Как раз таки многие противники красивого кода ссылаются на то, что становится больше классов. Да чего там. вот тут же есть предупреждение если много методов. Ок - путь решения декомпозировать класс. Но если это по структуре проекта неделимая "единица", то все они должны оказаться в одном модуле. как следствие две проверки конфликтующие между собой

Добавлено через 50 секунд
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это когда "нишевые" классы зависят от ключевых, например, в случае игры - оружие врага от игрока или главного контроллера игры.
Но все равно речь про связи в коде. Т.е. надо анализировать именно код.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 12:39  [ТС]
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это когда "нишевые" классы зависят от ключевых, например, в случае игры - оружие врага от игрока или главного контроллера игры.
Но машина не может определить, какой класс ключевой, а какой "нишевый", поэтому лучше проверять хотя бы количество классов, чем вообще ничего.
0
Эксперт .NET
 Аватар для Usaga
14790 / 9564 / 1367
Регистрация: 21.01.2016
Сообщений: 36,060
21.11.2025, 12:42
Цитата Сообщение от voral Посмотреть сообщение
захардкоженная привязка к другим классам это более серьезный признак плохого кода нежели количество классов.
Не обязательно это признак плохого кода... А так получается, что хороший код только тот, что на DI или фабрики завязан?))

Добавлено через 1 минуту
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Но машина не может определить, какой класс ключевой, а какой "нишевый", поэтому лучше проверять хотя бы количество классов, чем вообще ничего.
Как раз-таки лучше ничего, чем высосанная из пальца проверка. Ты нагружаешь свой язык лишней ответственностью какой-то.
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:44
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Но машина не может определить, какой класс ключевой, а какой "нишевый", поэтому лучше проверять хотя бы количество классов, чем вообще ничего.
увеличенное количестово классов может говорить наоборот о лучшем качестве
При этом даже если принять за то что количство это годный ориентир - это ОЧЕНЬ сильно зависит от проекта.

В шарпе же есть интерфейсы - точно так же можно избавляться от жестких связей

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Не обязательно это признак плохого кода... А так получается, что хороший код только тот, что на DI или фабрики завязан?))
Тут я больше не о том что вообще для всех случаев жизни, а о "скорее всего". в любом случае инструмент анализа кода должен обладать гибкостью и конфигурабельностью под проект.

В любом случае я прикинул все свои проекты и не смог вывести ни для одного "число классов, которое сигнализирует о плохом коде"
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 12:45  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
увеличенное количестово классов может говорить наоборот о лучшем качестве
А увеличенное количество сборок, если для них есть достаточно контента - не говорит о лучшем качестве?
Цитата Сообщение от voral Посмотреть сообщение
это ОЧЕНЬ сильно зависит от проекта.
Вроде как уже написал, что можно сделать несколько уровней строгости.
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:49
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Вроде как уже написал, что можно сделать несколько уровней строгости.
Если предположить что я стал пользоваться твоим ЯП. Эту проверку я бы отключал абсолютно всегда. Она вообще ни о чем не говорит

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А увеличенное количество сборок, если для них есть достаточно контента - не говорит о лучшем качестве?
Количество каким образом? Модуль/сборка тоже не должна делиться по каким то надуманным причинам, если по ее бизнес-логике она ДОЛЖНА являться целостным и неделимым решением, как и класс в общем то..

Т.е. "количества" плохой признак. Количество строк в методе, количество методов в классе, количество символов в строке, еще как том может сигнализировать о чем то плохом.... а классы, сборки.... брр.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 12:51  [ТС]
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Но машина не может определить, какой класс ключевой, а какой "нишевый"
voral, а вот такая идея: определять "ключевые" по количеству членов (не функций, а всего членов) - плохо? То есть, если класс с 3 членами жестко зависит от класса с 100 членами, одновременно с множеством обратных зависимостей (чтобы исключить коллекции и прочие "фундаментальные" классы), то плохо. Или тоже не сработает?
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
21.11.2025, 12:56
бред. Представьте культиватор с бензонасосом. У него есть рама, колеса, лемех, двигатель. А теперь посчитаем сколько деталей у двигателя...
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
21.11.2025, 13:14  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Модуль/сборка тоже не должна делиться по каким то надуманным причинам, если по ее бизнес-логике она ДОЛЖНА являться целостным и неделимым решением, как и класс в общем то..
Можно разделить понятия "библиотека" и "модуль/сборка" - разрешить библиотеку, являющуюся целостным и неделимым решением, из нескольких модулей/сборок, но без двусторонних связей между ними. Хотя согласен, проверка по количеству - плохая, но должна быть какая-то формальная и хотя бы как-то ограничивающая спагетти. Такие критерии есть?

Добавлено через 1 минуту
Цитата Сообщение от voral Посмотреть сообщение
Представьте культиватор с бензонасосом. У него есть рама, колеса, лемех, двигатель. А теперь посчитаем сколько деталей у двигателя...
Двигатель не зависит от остальных блоков, поэтому пункт:
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
одновременно с множеством обратных зависимостей
- не выполняется.

Добавлено через 3 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Двигатель не зависит от остальных блоков
Хотя двигатель должен как-то передать работу на колеса, но для этого и есть интерфейсы...

Добавлено через 10 минут
На самом деле, и количество функций в классе не всегда информативно. Например, BaseList. Наверное, за сотню функций. Не статический. Тут только подавлять на уровне отдельного класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru