Brainstorming - pod jaką nazwą szukałbyś tej funkcji?

0
  1. Jesteś w projekcie
  2. Wiesz że są w tym projekcie dwie funkcje do podmiany tekstu w stringu.
    1. Jedna podmienia string innym stringiem (jak np w JS .replace('from', 'to')),
    2. Druga podmienia string callbackiem (jak np w JS .replace('from', () => 'replaced'))
  3. Wiesz, że jedna z nich nazywa się replace() a druga jakoś inaczej, ale nie do końca pamiętasz która jest która

Pod jaką nazwą szukałbyś tej drugiej? Jakieś nazwy wpadają do głowy? Byłoby to zapożyczenia z pythona np .sub() albo .exec(), czy raczej dwuczęściowe nazwy jak np replaceCallback()?

@cerrato: zaproponował w ogóle zmianę obu, czyli replaceWithString()+replaceWithCallback()

0

Może nie replaceCallback ale callbackReplace bym to nazwał 😛

5

Dla mnie, najbardziej intuicyjne, to szukanie ich pod tą samą nazwą (przeciążenie). Jeżeli z jakiegoś powodu to nie jest możliwe, to bym szukał pod .replaceAsync('from', () => 'replaced'))

4

W takim przypadku ja bym dał nie samo "gołe" replace() oraz wersję "ulepszoną", tylko od razu dał w obu (albo i większej ilości wariantów) nazwy opisowe. W Twoim przypadku nazwałbym wersję "zwykłą" replaceWithString(), a z callbackiem, przez analogię - replaceWithCallback().

0
piotrpo napisał(a):

to bym szukał pod .replaceAsync('from', () => 'replaced'))

cerrato napisał(a):

W takim przypadku ja bym dał nie samo "gołe" replace() oraz wersję "ulepszoną", tylko od razu dał w obu (albo i większej ilości wariantów) nazwy opisowe. W Twoim przypadku nazwałbym wersję "zwykłą" replaceWithString(), a z callbackiem, przez analogię - replaceWithCallback().

To będzie w języku w którym jest konwencja snake_case.

0

Może replaceCompute, replaceLazy? Ciężko gdybać, bo nie widzę zastosowania dla takiej funkcji: po co robić takie coś?

0
slsy napisał(a):

Może replaceCompute, replaceLazy?

.

Riddle napisał(a):

To będzie w języku w którym jest konwencja snake_case.

0
slsy napisał(a):

Może replaceCompute, replaceLazy? Ciężko gdybać, bo nie widzę zastosowania dla takiej funkcji: po co robić takie coś?

Lazy by mi sugerowała że sama operacja podmiany będzie lazy.

BTW w Javie wymyślili takiego potworka

orElse(T other)
orElseGet(Supplier<? extends T> other)

Za to w vavr Jest taka sama nazwa:

getOrElse(Supplier<? extends T> supplier)
getOrElse(T other)

Ale zakładam że to będzie dla PHP (czy innego dynamicznie typowanego języka) i nie można używać przeciążania metod/funkcji

BTW jeszcze z "dziennikarskiego obowiązku" powiem że w Scali w ogóle nie ma rozróżnienia bo tam można użyć leniwej ewaluacji parametrów i jest jedna metoda

getOrElse[B >: A](default: => B): B
1
$str = $` . fun($&) . $' while($str =~ m/(<blablabla>)/);

xD

A zakładając inny język replace_with_function. Callback raczej nie pasuje, bo odnosi się do wywołania asynchronicznego, a chyba nie o to chodzi. Jednak, tak napradę, zkładając, że język jest w miarę ogarnięty to raczej w tę stronę:

new Replacer(()=>/*...*/).apply(regex, string)

Generalnie trudno orzec, tyle jest różnych konwencji…

0
elwis napisał(a):

Generalnie trudno orzec, tyle jest różnych konwencji…

Wylicz wszystkie jakie Ci przychodzą do głowy.

0
Riddle napisał(a):
elwis napisał(a):

Generalnie trudno orzec, tyle jest różnych konwencji…

Wylicz wszystkie jakie Ci przychodzą do głowy.

Chyba już tylko fsub(regex, ()=>/*...*/, string) :) ewentualnie fnsub. Trudno wymyśleć na poczekaniu.

0

nazwał bym samym rEPlaCe i dał możliwość wyboru jaki argument przekazujemy i tyle

0

Tymczasem Perl nie ma funkcji replace, zamiast tego jest operator =~ który może przyjąć flagę e żeby interpretował to co zamienia jako kod Perla

use strict;
use warnings;

my $string;

sub callback {
    return "to"
}

$string = "Hello from the other side";
$string =~ s/from/to/;
print $string, "\n";

$string = "Hello from the other side";
$string =~ s/from/callback($1)/e;
print $string, "\n";
4

Bez znajomości języka ciężko odpowiedziec na to pytanie. Zrobiłbym tak samo jak robi biblioteka do regexów z biblioteki standardowej. Np:

  • W Pythonie re.sub() obsługuje oba przypadki, i w zależności od parametru podmienia na stały string albo wynik funkcji, więc przeciążyłbym funkcję.
  • w C# podobnie, Regex.Replace robi wszystko
  • W PHP jest preg_replace_callback i preg_replace, więc nazwałbym moje funkcje replace i replace_callback

etc

0
msm napisał(a):

Bez znajomości języka ciężko odpowiedziec na to pytanie. Zrobiłbym tak samo jak robi biblioteka do regexów z biblioteki standardowej. Np:

  • W Pythonie re.sub() obsługuje oba przypadki, i w zależności od parametru podmienia na stały string albo wynik funkcji, więc przeciążyłbym funkcję.
  • w C# podobnie, Regex.Replace robi wszystko

Gdyby temat był prosty, to zapewnian was że nie przychodziłbym z takim pytaniem na forum. Zadaje je dlatego bo sam się nad tym długo zastanawiam i dlatego pytam.

Przykłady z góry odpadają, bo nazwy muszą być dwie.

msm napisał(a):
  • W PHP jest preg_replace_callback i preg_replace, więc nazwałbym moje funkcje replace i replace_callback

etc

Dzieki, dodaje kolejny plusik pod "replace_callback"

1
Riddle napisał(a):
msm napisał(a):

Bez znajomości języka ciężko odpowiedziec na to pytanie. Zrobiłbym tak samo jak robi biblioteka do regexów z biblioteki standardowej. Np:

  • W Pythonie re.sub() obsługuje oba przypadki, i w zależności od parametru podmienia na stały string albo wynik funkcji, więc przeciążyłbym funkcję.
  • w C# podobnie, Regex.Replace robi wszystko

Gdyby temat był prosty, to zapewnian was że nie przychodziłbym z takim pytaniem na forum. Zadaje je dlatego bo sam się nad tym długo zastanawiam i dlatego pytam.

Przecież temat jest banalny (dla doświadczonej osoby np. rok doświadczenia)

0
replace_string(to_replace: str, replace_value: str) -> str
replace_callback(to_replace: str, callback: Callable[[], str]) -> str
replace(**kwargs) -> str

Jak ktoś nie pamięta, której użyć, to w replace wywoływać odpowiednią na podstawie parametrów.

BTW: Można matchować w Pythonie po typach?

2
szafran98 napisał(a):

BTW: Można matchować w Pythonie po typach?

Niby można:

def foo(bar):
  if type(bar) == int:
    print(2 * bar)
  elif type(bar) == str:
    print("->", bar, "<-")
  else:
    print("baz")

foo(16)    # 32
foo("16")  # -> 16 <-
foo(16.0)  # baz

Ale to zabija 95% zysku z duck typingu, jednocześnie wciąż ciągnąc za sobą jego wszystkie wady…


EDYCJA:

@KamilAdam:

przydałby się switch/match

def foo(bar):
  match bar:
    case int(x):
      print(2 * x)
    case str(x):
      print("->", bar, "<-")
    case _:
      print("baz")

foo(16)    # 32
foo("16")  # -> 16 <-
foo(16.0)  # baz
0

Przeciąż funkcję jak możesz i po problemie

0

replace

1

Ciekawostka, jak to w Rust zrobili.

W Rust nie ma overloadingu funkcji, więc teoretycznie powinny być funkcje o innych nazwach, tak?
No niekoniecznie, bo w Rust są traity i generyki. I tym sposobem metoda replace przyjmuje cokolwiek, co implementuje trait Replacer (który już jest zaimplementowany dla &str, ale również można użyć domknięcia:

Note that this function is polymorphic with respect to the replacement. In typical usage, this can just be a normal string:

let re = Regex::new("[^01]+").unwrap();
assert_eq!(re.replace("1078910", ""), "1010");
But anything satisfying the Replacer trait will work. For example, a closure of type |&Captures| -> String provides direct access to the captures corresponding to a match. This allows one to access capturing group matches easily:

https://docs.rs/regex/latest/regex/struct.Regex.html

Więc to pozwala na użycie jednej funkcji, która może przyjmować jednak różne argumenty. Więc człowiek zadowolony, że ma jedną metodę, a i system typów zadowolony, więc się kompiluje, mimo że nie ma teoretycznie overloadingu metod:

use regex::{Captures, Regex};

fn main() {
    let re = Regex::new(r"\d+").unwrap();
    println!("{}", re.replace("kotek 123", "456")); // kotek 456
    println!(
        "{}",
        re.replace("kotek 123", |caps: &Captures| {
            format!("liczba({})", &caps[0])
        })
    ); // kotek liczba(123)
}

0
Escanor16 napisał(a):

Przeciąż funkcję jak możesz i po problemie

.

szafran98 napisał(a):

Jak ktoś nie pamięta, której użyć, to w replace wywoływać odpowiednią na podstawie parametrów.

.

Powtarzałem już raz, i powtórzę drugi - to muszą być dwie funkcje, szukam dwóch nazw.

1

jak mają być dwie, to może replace oraz replace_with_callback?

Poza tym - czy w twoim języku wygodnie się robi funkcje anonimowe? Bo jeśli tak, to może nawet nie ma sensu dzielić na 2 funkcje, tylko zrobić jedną funkcję, która przyjmuje zawsze callback np. w JS można coś takiego sobie wymyślić:

foo("kotek", () => "piesek")

5 znaków więcej tylko () =>. Gorzej jeśli musiałbyś tworzyć coś w stylu function. Np. w starym JS:

foo("kotek", function () {
   return "piesek";
})
0
anonimowy napisał(a):
Riddle napisał(a):
msm napisał(a):

Bez znajomości języka ciężko odpowiedziec na to pytanie. Zrobiłbym tak samo jak robi biblioteka do regexów z biblioteki standardowej. Np:

  • W Pythonie re.sub() obsługuje oba przypadki, i w zależności od parametru podmienia na stały string albo wynik funkcji, więc przeciążyłbym funkcję.
  • w C# podobnie, Regex.Replace robi wszystko

Gdyby temat był prosty, to zapewnian was że nie przychodziłbym z takim pytaniem na forum. Zadaje je dlatego bo sam się nad tym długo zastanawiam i dlatego pytam.

Przecież temat jest banalny (dla doświadczonej osoby np. rok doświadczenia)

  • Wymyślenie byle jakiej nazwy, pewnie tak.
  • Wymyślenie nazwy replace() kiedy mamy do dyspozycji przeładowanie metod - również tak

Ale wymyślenie dobrej nazwy dla dwóch metod, kiedy nie można przeciążać metod już nie jest takie proste.

Jeśli to takie proste to jakie masz pomysły?

0

Nie chce podawać jezyka, bo nie chce żeby odpowiadający sugerowali się istniejącymi konwencjami.

Chciałbym jeszcze raz zaapelować do wszystkich odpowiadających: w wątku chodzi o burzę mózgów nt. nazw funkcji, nazw, nazw i tylko i wyłączeni nazw. Nie jest to wątek nt tego jak można inaczej zaprogramować api, żeby dało się jedną metodą robić replace'a callbackiem i stringiem - wątek tyczy się tylko i wyłącznie nazw.

0

Doczytaj proszę o https://typeofweb.com/problem-xy-czyli-gdy-nie-wiemy-o-co-pytamy Problem XY.
Jest to klasyczna pułapka na początkujących. Jako, że temat jest banalny dla doświadczonego programisty (1+ rok doświadczenia) wiele by nam ułatwiło gdybyś przedstawił kontekst

1

Jeżeli chodzi tylko i wyłącznie o nazwy takiej pary funkcji w snake case to skłaniałbym się do str.replace i str.replace_with_callback. str.replace_callback sugeruje bowiem, że zmieniamy jakiś tam callback wewnątrz stringa, a nie sam string.

0
anonimowy napisał(a):

Doczytaj proszę o https://typeofweb.com/problem-xy-czyli-gdy-nie-wiemy-o-co-pytamy Problem XY.
Jest to klasyczna pułapka na początkujących. Jako, że temat jest banalny dla doświadczonego programisty (1+ rok doświadczenia) wiele by nam ułatwiło gdybyś przedstawił kontekst

Jezu, a ten znowu swoje.

Jeśli ten problem jest tak banalny, to proszę zaprezentuj nam jego banalność, i podaj dwa przykłady nazw funkcji do zamiany stringa, jedna innym stringiem, druga callbackiem. Wymyślisz coś sensownego, oraz innego niż to co podali przedmówcy (czyli np replace + replace_callback)?

2

str_replace
str_replace_callback

0
Riddle napisał(a):
anonimowy napisał(a):

Doczytaj proszę o https://typeofweb.com/problem-xy-czyli-gdy-nie-wiemy-o-co-pytamy Problem XY.
Jest to klasyczna pułapka na początkujących. Jako, że temat jest banalny dla doświadczonego programisty (1+ rok doświadczenia) wiele by nam ułatwiło gdybyś przedstawił kontekst

Jezu, a ten znowu swoje.

Jeśli ten problem jest tak banalny, to proszę zaprezentuj nam jego banalność, i podaj dwa przykłady nazw funkcji do zamiany stringa, jedna innym stringiem, druga callbackiem. Wymyślisz coś sensownego, oraz innego niż to co podali przedmówcy (czyli np replace + replace_callback)?

A po co wymyślać koło na nowo? Dlatego mówię, że to jest pułapka początkujących, którzy często chcą robić coś od nowa co już zostało zrobione. M.in zahacza o to wspomniany problem XY, poczytaj o nim proszę. Nazywanie rzeczy ma tylko sens jeśli ma się kontekst, którego tu brak. Każdy język, framework, biblioteki wewnętrzne czy nawet publiczne mają swoje konteksty i nawet w tym samym języku dwie te same rzeczy powinny być nazwane w zależności od tych kontekstów już pomijając całkowicie kontekst biznesowy.

Póki nie masz takiego doświadczenia bierz sobie do serca rady bardziej doświadczonych bo czasem ten senior może mieć jednak rację, nie zawsze trzeba tupać nogą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1