Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> строгая vs не строгая типизация, что лучше 
:(
    Опции темы
 
Какая типизация лучше?
не строгая [ 15 ]  [23.44%]
строгая [ 49 ]  [76.56%]
Всего проголосовавших: 64
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
Logo
Дата 10.2.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Что лучше? Какие преимущества у одной перед другой?
PM MAIL   Вверх
azesmcar
Дата 10.2.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(Logo @  10.2.2010,  10:18 Найти цитируемый пост)
Что лучше? Какие преимущества у одной перед другой? 

Мое мнение - строгая, преимущества? Уменьшает количество потенциальных ошибок, делает код более понятным..по моему у нестрогой было только одно преимущество, которого после добавления в C# var не стало.
PM   Вверх
Lazin
Дата 10.2.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



строгая smile 
PM MAIL Skype GTalk   Вверх
nginx
Дата 10.2.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 20.6.2009

Репутация: -4
Всего: -3



Logo, строгая, ненавижу, что начал свое знакомство с программирование с PHP
он не только динамично-типиз, он в свою очередь еще и слабо-типиз в отличии от Питона
лучше начинать с .NET или Java любому начинающему
PM MAIL   Вверх
Logo
Дата 10.2.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Я вот больше работал с языками с не строгой типизацией - PHP, Perl, JavaScript. Со строгими, вроде C++(относительно строгой), значительно меньше. Ну а начинал с бейсика)

Цитата

Уменьшает количество потенциальных ошибок


Можно пример подобных ошибок? smile 

PM MAIL   Вверх
azesmcar
Дата 10.2.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(Logo @  10.2.2010,  12:00 Найти цитируемый пост)
Можно пример подобных ошибок? smile 

ну например
Код

<?php
    $i = 0;
    $t = "";
    if ($i == $t)
        echo "true";
?>

да, этого можно избежать используя ===, но дело в том, что сравнение разных типов может являться ошибкой и тут нужно внимание программиста а не результат в виде false (или тем более true). В языках со строгой типизацией тут понадобился бы cast, тем самым вы сообщите компилятору/интерпретатору что вы на самом деле хотите сравнить два разных типа. Это нагляднее и для программиста, читающего код. Строгая типизация позволяет уберечься от многих ошибок, совершенных по невнимательности.

К примеру в C++ у людей нередко возникают ошибки в связи с неявным приведением int-а к bool.

Это сообщение отредактировал(а) azesmcar - 10.2.2010, 12:16
PM   Вверх
kemiisto
Дата 10.2.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Logo, прежде чем говорить о типизации, предоставьте определения: что Вы называете строгой и нестрогой типизацией. А пока разговор ниачём. smile 

К примеру, если в понятие строгая типизация включать невозможность неявного приведения типов (implicit type conversion), что, кстати говоря, делают часто, то Python нестрого типизированный язык.

Иногда строгой считают типизацию, где вообще запрещены любые приведения типов - будь то неавные или явные.

Так что - ждём-с определений. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Logo
Дата 10.2.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Это да, операторы сравнения в некоторых языках черезчур перегружены, сравнивая числа и строки. Легко забыть, что имеет приоритет при сравнении разных типов, числовой или строковый.
Здесь мне нравится подход Perl, в котором разные операторы сравнения строк и чисел
Код

$i = 0;
$t = "";

if ($i == $t) {  #предупреждение о том что $t не число
  print "сравнение как числа, равны"
}

if ($i eq $t) {

} else {
   print "сравнение как строки, не равны";
}


С учетом этого, могут быть какие-то ошибки?

А PHP вообще отдельная история 
Код

<?php
  if("2" == "   2.000")
    echo 'Я сравнил их как числа';

Но это не значит что это гуд.

Это сообщение отредактировал(а) Logo - 10.2.2010, 13:15
PM MAIL   Вверх
Lazin
Дата 10.2.2010, 12:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



kemiisto, неявное приведение типов тоже бывает разным, к примеру, в приведении int к double я ничего плохого не вижу, а наоборот лучше только явно, причем функциями floor и ceil
PM MAIL Skype GTalk   Вверх
Logo
Дата 10.2.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Цитата

К примеру в C++ у людей нередко возникают ошибки в связи с неявным приведением int-а к bool.

А что там не понятного - 0 - false, остальное true, как везде
PM MAIL   Вверх
azesmcar
Дата 10.2.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(Logo @  10.2.2010,  12:38 Найти цитируемый пост)
А что там не понятного - 0 - false, остальное true, 

я не говорил что непонятно smile я говорю проблемы возникают иногда..представь что переменная раньше была типа bool, хранила два статуса, потом расширили програмку (ну не учли этого) и сменили тип на int, вот забудешь в каком нибудь if -е поменять потом ищи проблему в логике, а ведь компилируется нормально. Кому как, по мне так лучше бы этого не было.
Цитата

как везде 

если не ошибаюсь, джава этого не позволяет.

Это сообщение отредактировал(а) azesmcar - 10.2.2010, 12:45
PM   Вверх
Logo
Дата 10.2.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: нет
Всего: 10



Цитата(kemiisto @ 10.2.2010,  12:19)
Logo, прежде чем говорить о типизации, предоставьте определения: что Вы называете строгой и нестрогой типизацией. А пока разговор ниачём. smile 

К примеру, если в понятие строгая типизация включать невозможность неявного приведения типов (implicit type conversion), что, кстати говоря, делают часто, то Python нестрого типизированный язык.

Иногда строгой считают типизацию, где вообще запрещены любые приведения типов - будь то неавные или явные.

Так что - ждём-с определений. smile

Да как и все - строгая, когда не производятся не явные приведения типов, не строгая - когда производятся.
Динамическая - когда можно менять тип по ходу выполнения программы, и соответственно проверка типов на этапе исполнения - статическая, наоборот, на этапе компиляции.

Добавлено через 2 минуты и 31 секунду
Цитата

как везде 

... при приведении типов
PM MAIL   Вверх
kemiisto
  Дата 10.2.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Lazin @  10.2.2010,  13:37 Найти цитируемый пост)
kemiisto, неявное приведение типов тоже бывает разным, к примеру, в приведении int к double я ничего плохого не вижу, а наоборот лучше только явно, причем функциями floor и ceil

Спасибо, что просветил, мил человек. smile А то я ведь не знал. Думал, что только 2 типа данных существует на свете: int и bool. 

Насчёт приведение целое -> The IEEE Standard for Floating-Point Number: тут тоже есть свои подводные камни. Не всякое целое число точно представимо. Думаю, ты про это прекрасно знаешь и, конечно же, читал What Every Computer Scientist Should Know About Floating-Point Arithmetic. Но уж коли ты решил мне рассказать про общечеловеческие ценности, я тоже в долгу не останусь. smile 

А так, да, согласен. В Oberon фенкция называиццо ENTIER(x). Аргумент - real type, тип результате - LONGINT. Возвращает largest integer not greater than x.

Это сообщение отредактировал(а) kemiisto - 10.2.2010, 13:16


--------------------
PM MAIL WWW GTalk Jabber   Вверх
UniBomb
Дата 10.2.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Цитата(azesmcar @  10.2.2010,  13:11 Найти цитируемый пост)

<?php
    $i = 0;
    $t = "";
    if ($i == $t)
        echo "true";
?>

В руби такое не проходит. 0 и nil там всё же разные вещи. Даже оператор === говорит не эквивалентны

Цитата(Logo @  10.2.2010,  13:36 Найти цитируемый пост)

<?php
  if("2" == "   2.000")
    echo 'Я сравнил их как числа';


Раби и тут говорит, что ни о каком равенстве никакой речи и быть не может.

Цитата(Logo @  10.2.2010,  13:38 Найти цитируемый пост)
0 - false, остальное true, как везде

Вы таки наверное уже догадались?


Мне нравится нестрогая типизация в Ruby, но я в этом ничего не понимаю  smile 


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 10.2.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



юзайте аннотации и декораторы для проверки типов
Код

#!/usr/bin/python3

import inspect
import functools

def strictly_typed(function):
    annotations = function.__annotations__
    arg_spec = inspect.getfullargspec(function)
    assert "return" in annotations, "missing type for return value"
    for arg in arg_spec.args + arg_spec.kwonlyargs:
        assert arg in annotations, "missing type for parameter '{1}'".format(arg)
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        for name, arg in list(zip(arg_spec.args, args)) + list(kwargs.items()):
            assert isinstance(arg, annotations[name]), "expected argument '{0}' of {1} got {2}".format(name, annotations[name], type(arg))
        result = function(*args, **kwargs)
        assert isinstance(result, annotations["return"]), "expected return of {0} got {1}".format(annotations["return"], type(result))
        return result
    return wrapper

@strictly_typed
def main(argv : tuple, value) -> int:
    return value

# main((), 1)
# main((), 1.)
# main([], 1)


ps. код честно взят из одного источника ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1664 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.