Bir statik sinif və bir tək nümunə arasındakı fərq?

Statik sinif və tək nümunə arasında real (yəni praktik) fərq nədir?

Hər ikisi də nümunə olmadan çağırıla bilər, hər ikisi də yalnız bir nümunə təmin edir və onların heç biri təhlükəsizdir. Digər fərq varmı?

1489
06 февр. Jorge Córdoba tərəfindən soruşuldu 06 Fevral 2009-02-06 11:13 '09 at 11:13 2009-02-06 11:13
@ 38 cavab
  • 1
  • 2

Bir tək və ya statik metodun işlədilməməsi nə deməkdir? Əksər hallarda iplik təhlükəsizliyini təmin etmək üçün həm də tətbiq edilməlidir.

Bir singleton və bir çox statik metod arasında böyük fərq, təkamülçülər interfeyslər (ya da mənim təcrübəmdə belə olmadığı halda faydalı bazası siniflərdən çıxarış) həyata keçirə bilər, belə ki, sankttonun sanki " yalnız bir "həyata keçirilməlidir.

1042
06 февр. Jon Skeetə cavab 06 fevral. 2009-02-06 11:17 '09 at 11:17 pm 2009-02-06 11:17

Doğru cavab: Jon Skeet, burada başqa forumda .

border=0

Bir tək nümunə bir yaradılmış nümunəyə daxil olmaq imkanı verir - bu instansiya (daha doğrusu, bu instansiyaya keçid) başqa bir üsula parametr kimi qəbul edilə və normal bir obyekt kimi qəbul edilə bilər.

Statik sinif yalnız statik metodlara imkan verir.

403
06 февр. bir cavab verildi Kezzer 06 Fevral. 2009-02-06 11:21 '09 at 11:21 AM 2009-02-06 11:21
  • Singleton obyektləri Heap saxlanılır, lakin statik obyektlər yığında saxlanılır.
  • Biz bir dizayn edə bilərik (dizayner onu qadağan etsə) tək bir obyekt, amma statik bir sinif obyektini klonlaya bilmərik.
  • Tek sinif OOP (obyektə yönəlmiş prinsiplər) əməl edin, statik siniflər yoxdur.
  • Sinif Singleton ilə bir interface tətbiq edə bilərik, lakin sinif statik metodları (və ya, məsələn, C # static class ) ola bilməz.
324
11 сент. Cavab Vadluri Sreenu 11 sep tərəfindən verilir . 2012-09-11 13:22 '12 at 13:22 2012-09-11 13:22

Singleton şablonu statik dərslər üzərində bir sıra üstünlüklərə malikdir. Birincisi, singleton sinifləri genişləndirə və interfeyslər tətbiq edə bilər, lakin statik bir sinif (bu dərsləri genişləndirə bilər, lakin onların nümunələrini devralmayacaq) ola bilməz. Sintaksis, sinif və ya asinxronlaşdırıla bilər, statik sinif ilk dəfə yüklənərkən başlanır və potensial sinif loader problemlərinə səbəb olur. Lakin, ən mühüm üstünlüyü, singletons istifadəçilər yalnız bir nümunəsi olduğunu hesab etmək üçün məcbur olmadan, polimorfik işlənmiş ola bilər.

122
06 февр. cavab neil.johnson verildi 06 Fevral. 2009-02-06 11:30 '09 saat 11:30 'da 2009-02-06 11:30

static siniflər dövlətdə heç bir şey etməməlidir, yəni Math funksiyalarının (ya da layihələrdə Utils ) birləşməsi üçün faydalıdır. Beləliklə, sinifin adı sadəcə funksiyaları tapa biləcəyimiz bir şeydir və daha çox bir şey verir.

Singleton mənim sevimli nümunəm və bir nöqtədə bir şeyi idarə etmək üçün istifadə edir. static siniflərə nisbətən daha çevikdir və dövləti saxlaya bilər. Bu, digər siniflərdən miras qalan və mirasçılığa imkan verən interfeyslər həyata keçirə bilər.

staticSingleton arasında seçim etmək üçün mənim qayda:

Xüsusiyyət seti birlikdə saxlanılsa, static bir seçimdir. Bəzi resurslara vahid çıxışı tələb edən bir şey Singleton tərəfindən həyata keçirilə bilər.

56
30 дек. Cavab Xaqron tərəfindən verilir 30 dekabr. 2010-12-30 23:55 '11 'də 11:55' də 2010-12-30 23:55 'də

Statik sinif: -

  • Statik sinif bir nümunəsi yarada bilməzsiniz.

  • Bir sinifdən ibarət bir proqram və ya ad sahəsi yükləndiyi zaman ümumi .NET Framework (CLR) dili ilə avtomatik yüklənir.

  • Statik sinif bir konstruktor ola bilməz.

  • Statik bir sinfi bir üsula keçə bilmərik.

  • Statik sinfi başqa Statik sinifdən C # -də devrala bilmirik.

  • Bütün statik metodları olan bir sinif.

  • Daha yaxşı performans (statik metodlar kompilyasiya müddətində bağlıdır)

Singleton: -

  • Bir obyektin bir nümunəsi yarada və yenidən istifadə edə bilərsiniz.

  • Istifadəçi tələb etdiyində ilk dəfə bir tək nümunə yaradılır.

  • Singleton sinifi bir konstruktor ola bilər.

  • Singleton sinifinin bir obyekti yarada və üsula keçə bilərsiniz.

  • Singleton sinifində heç bir miras qoyuluşu yoxdur.

  • Biz tək sinif obyektləri məhv edə bilərik, lakin statik bir sinif deyil.

  • Metodlar ləğv edilə bilər.

  • Lazım olduqda yükləmək üçün tənbəl ola bilər (statik dərslər həmişə yüklənir).

  • Biz interfeysi tətbiq edə bilərik (statik sinif interfeysi tətbiq edə bilmir).

49
01 июня '15 в 14:42 2015-06-01 14:42 Cavab RajeshVerma tərəfindən 1 iyun 'da 14:42 ' də verildi. 2015-06-01 14:42

Statik sinif ən yaxşı sözün "funksiyaları" olacaq yalnız statik metodlara malik olanlardan biridir. Statik sinifdə təsvir edilən dizayn tərzi tamamilə prosedurdur.

Singleton, OO dizaynına xüsusi bir şablondur. Həyat dövründə bu xüsusi rolun yalnız bir nümunəsinin mövcud olmasını təmin edən bir yaradılış prosedurası ilə bir obyektin nümunəsi (bu xüsusiyyətlərə malik olan bütün imkanlar ilə, məsələn, polimorfizmlə).

47
06 февр. Cavab Morendil tərəfindən verilmişdir 06 fevral. 2009-02-06 11:35 '09 at 11:35 'da 2009-02-06 11:35

Tək bir şablonda, tekil tipli bir nümunə olaraq single yaratmaq olar, bunu statik bir sinif ilə edə bilməzsiniz.

Tez nümunə:

 if( useD3D ) IRenderer::instance = new D3DRenderer else IRenderer::instance = new OpenGLRenderer 
32
06 февр. cavab Don Neufeld 06 Fevral. 2009-02-06 11:16 '09 at 11:16 AM 2009-02-06 11:16

Jon Skeet Cavabına keçmək üçün

Singleton və boş statik metodlarla olan böyük fərq, təkamülçülərin interfeysləri (ya da faydalı bazası siniflərindən çıxarış olsa da, bu daha az ümumi bir IME olmasıdır), yəni "yalnız fərqli" kimi sanki təkrar edə bilərsiniz.

Singletons vahid test sinifində işləmək daha asandır. Tək parametrlər (qurucular, qurucular və ya üsullar) olaraq tək başına keçsəniz, təklintəkilərin istehza və ya sıvalı versiyasını əvəz edə bilərsiniz.

22
21 дек. Cavab Mike Rylander tərəfindən 21 dekabrda verilir. 2012-12-21 00:53 '12 at 0:53 2012-12-21 00:53

Singletonun digər bir üstünlüyü ondan ibarətdir ki, asanlıqla serializə oluna bilər və dövlətin diskini saxlamaq və ya uzaqdan göndərmək lazımdır.

20
08 авг. cavab verildi Alex 08 aug. 2011-08-08 06:36 '11 at 06:36 2011-08-08 06:36

Mən OO-nun böyük teoretri deyiləm, amma bildiyim şeydən, Singletons ilə müqayisədə statik dərsləri olmayan yeganə OO funksiyası polimorfizmdir. Lakin ehtiyacınız yoxdursa, statik bir sinif ilə əlbəttə ki, miras ala bilərsiniz (interface tətbiqinə əmin deyil) və məlumatları və funksiyaları əhatə edir.

Morendilin şərhində: "Statik bir sinifdə təsvir edilən dizayn tərzi tamamilə prosessualdır", mən səhv ola bilərəm amma razı deyiləm. Statik metodlarda statik üzvlərə müraciət edə bilərsiniz. Bu, tək nümunəvi metodlarla eyni olacaq, nümunənin fərdi üzvlərinə daxil olur.

Redaktə:
İndi düşünürəm ki, başqa bir fərq, Statik sinif proqramın başladığı zaman yaradılıb * və proqramın həyatı boyunca yaşayır, baxmayaraq ki, bir nöqtədə müəyyən bir nöqtədə yaradılır və məhv edilə bilər.

* və ya ilk istifadədə yaradıla bilər, dilinə bağlı olaraq düşünürəm.

17
16 авг. Cavab Petruza 16 avqustda verilir . 2009-08-16 18:54 '09 at 18:54 'da 2009-08-16 18:54

Yaxşı bir məqalə: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

Statik dərslər

  • bütün statik metodlara malik olan sinifdir.
  • daha yaxşı performans (statik metodlar kompilyasiya müddətində bağlıdır)
  • metodları köçürə bilməz, lakin gizlətmə metodundan istifadə edə bilərsiniz. ( Bu üsul Java-da gizlədir? JavaDoc-un izahı belə qarışıqdır )

     public class Animal { public static void foo() { System.out.println("Animal"); } } public class Cat extends Animal { public static void foo() { // hides Animal.foo() System.out.println("Cat"); } } 

Singleton

Ümumiyyətlə, hər şey üçün Singleton istifadə və istifadə üsullarını saxlamaq üçün yalnız statik dərsləri istifadə edərdim.


düzəlişlər

16
24 апр. Apr 24-də JackDev tərəfindən verilmiş cavab 2014-04-24 04:22 '14 da 4:22 2014-04-24 04:22

Yəhyanın nöqtəsini göstərmək üçün Logger statik bir sinif olduğu təqdirdə aşağıdakıları göstərmək mümkün deyil. SomeClass sınıfı, ILogger uygulamasının bir örneğini ILogger .

Singleton sinifi bağımlılığı müdaxilə üçün vacibdir.

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { var someClass = new SomeClass(Logger.GetLogger()); } } public class SomeClass { public SomeClass(ILogger MyLogger) { } } public class Logger : ILogger { private static Logger _logger; private Logger() { } public static Logger GetLogger() { if (_logger==null) { _logger = new Logger(); } return _logger; } public void Log() { } } public interface ILogger { void Log(); } } 
14
10 июня '13 в 2:49 2013-06-10 02:49 cavabı developer747 10 iyun 'da 2:49' də verildi 2013-06-10 02:49

Bəli, bir single, IS tərəfindən yaradılmış normal bir sinifdir, lakin müştəri kodundan yalnız bir dəfə və dolayı yolla. Statik sinif yaradılmır. Bildiyimiz kimi, statik metodlar (statik sinif statik metodlara malik olmalıdır) qeyri-statik olanlardan daha sürətlidır.

Düzenle:
FxCop performans qaydasının təsviri: "Məsələn data və ya nümunə çağırışlarına giriş imkanı olmayan üsullar statik (VB-də paylaşılan) kimi qeyd edilə bilər. Bundan sonra kompilyator, bu üzvlərə qeyri-virtual çağırış saytları çıxaracaq, mövcud obyekt göstəricisinə qeyri-boşluq yaradan bir çağrı, performansa həssas kod üçün ölçüle bilən performans qazanmalarına səbəb ola bilər. Bəzi hallarda, mövcud obyektin bir nümunəsinə girişdən imtina düzgün bir problemdir. "
Statik siniflərdə statik metodlara tətbiq oluna biləcəyini bilmirəm.

11
06 февр. Cavab agnieszka verildi 06 fevral. 2009-02-06 12:36 '09 at 12:36 AM 2009-02-06 12:36

Sintaksis yaradılıb, bu, heç bir zaman yaradılan tək nümunəsidir, bu səbəbdən Singletonda təkdir.

Statik bir sinif, özündən başqa hər hansı bir tərəfindən yaradıla bilməz.

8
06 февр. bir cavab verildi Kezzer 06 Fevral. 2009-02-06 11:15 '09 saat 11:15 'də 2009-02-06 11:15

Bu təriflə razıyam:

" Tek " sözü, dövrün tətbiqi dövründə bir obyekt deməkdir, beləliklə, tətbiq olunan səviyyə tətbiq səviyyəsindədir.

statik hər hansı bir obyekt göstəricisi yoxdur, beləliklə tətbiq sahəsi domen səviyyəsindədir.

Əlavə olaraq, həm də mövzuların təhlükəsizliyini təmin etmək üçün həm də tətbiq edilməlidir.

Digər maraqlı fərqləri tapa bilərsiniz: Sintaksis nümunəsi statik sinifə qarşı

5
11 февр. Cavab 11 fevral tarixində Alessandro Ornano tərəfindən verilir . 2016-02-11 18:08 '16 saat 06:08 'da 2016-02-11 18:08

Singleton test üçün daha yaxşıdır. Statik dərslərdən fərqli olaraq, singleton interfeyslər həyata keçirə bilər və siz məkan nümunəsini istifadə edə və onları embed edə bilərsiniz.

Aşağıdakı nümunədə bunu göstərəcəyəm. GetPrice () metodunu istifadə edən bir isGoodPrice () metodu olduğunuzu düşünürük və getPrice () funksiyasını single formatında yerinə yetirirsiniz.

getPrice funksionallığını təmin edən singleton:

 public class SupportedVersionSingelton { private static ICalculator instance = null; private SupportedVersionSingelton(){ } public static ICalculator getInstance(){ if(instance == null){ instance = new SupportedVersionSingelton(); } return instance; } @Override public int getPrice() { // calculate price logic here return 0; } } 

GetPrice istifadə edin:

 public class Advisor { public boolean isGoodDeal(){ boolean isGoodDeal = false; ICalculator supportedVersion = SupportedVersionSingelton.getInstance(); int price = supportedVersion.getPrice(); // logic to determine if price is a good deal. if(price < 5){ isGoodDeal = true; } return isGoodDeal; } } In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by: Make your singleton implement an interface and inject it. public interface ICalculator { int getPrice(); } 

Final Singleton tətbiqi:

 public class SupportedVersionSingelton implements ICalculator { private static ICalculator instance = null; private SupportedVersionSingelton(){ } public static ICalculator getInstance(){ if(instance == null){ instance = new SupportedVersionSingelton(); } return instance; } @Override public int getPrice() { return 0; } // for testing purpose public static void setInstance(ICalculator mockObject){ if(instance != null ){ instance = mockObject; } 

test sinfi:

 public class TestCalculation { class SupportedVersionDouble implements ICalculator{ @Override public int getPrice() { return 1; } } @Before public void setUp() throws Exception { ICalculator supportedVersionDouble = new SupportedVersionDouble(); SupportedVersionSingelton.setInstance(supportedVersionDouble); } @Test public void test() { Advisor advidor = new Advisor(); boolean isGoodDeal = advidor.isGoodDeal(); Assert.assertEquals(isGoodDeal, true); } } 

GetPrice () tətbiq etmək üçün statik metoddan istifadə etmək üçün alternativi götürsək, getPrice () sxemini almaq çətin idi. Statik enerjinin üslubu ilə istehza edə bilərsiniz, lakin hər kəs onu istifadə edə bilməz.

5
13 апр. Cavab Amir Bareket Apr 13 2014-04-13 15:55 '14 da 15:55 2014-04-13 15:55

Arxa bitişik əlaqələri olan DB infrastrukturumuz var. Birdən çox istifadəçi üçün çirkli oxunmaların qarşısını almaq üçün, istənilən vaxt bir nümunənin mövcudluğunu təmin etmək üçün tək nümunə modelini istifadə etdik.

C # -də statik sinif bir interfeys tətbiq edə bilmir. Sınıfın bir örneği, iş müqavilələri və ya IoC hədəfləri üçün bir interfeys tətbiq etməsi lazım olduqda, burada mən statik sinif olmadan Singleton şablonunu istifadə edirəm.

Singleton dövləti dövlət olmadan dövlət yazmaq üçün bir yol təqdim edir

Bu sizə kömək edir.

4
27 июня '12 в 12:58 2012-06-27 12:58 Cavab RK_Muddala 27 iyun '12 saat 12:58' da verilir 2012-06-27 12:58

Bir fərqli fərq, təklinlə gələn fərqli bir müəllifdir.

Statik siniflər ilə, CLR tərəfindən yaradılır və biz bunu nəzarət etmirik. birincisi, obyektin əldə olunmağa çalışdığı birinci instansiyada bir nümunə götürülür.

4
27 июня '12 в 17:03 2012-06-27 17:03 Cavab Eranga Dissanayaka tərəfindən 27 iyun '17' də saat 17:03 'də veriləcək 2012-06-27 17:03
  • Lazy Loading
  • İnterfeys dəstək, beləliklə ayrı bir tətbiq təmin edilə bilər.
  • Tərif tipi (tənbəl yükləmə və interfeys tətbiqləri)
3
08 мая '12 в 19:34 2012-05-08 19:34 Cavab 08-24 may tarixində saat 19:34 'də Tilak tərəfindən verilir. 2012-05-08 19:34

Bir çox hallarda, ikisinin praktik bir fərqi yoxdur, xüsusilə tək nümunə nümunəsi heç vaxt dəyişməyəcək və ya çox yavaş dəyişir. konfiqurasiyaları dəstəkləyirik.

Mən ən böyük fərqi, xüsusi bir statik Java sinifinin əksinə olduğundan, singleletonun hələ normal bir Java Bean olduğunu söyləyərdim. Bu səbəbdən də təkamül bir çox digər hallarda qəbul edilir; bu, əslində, Bahar Çərçivəsinin yaradılması üçün standart strategiyadır. İstehlakçı bir elementin ötürüldüyünü bilir və ya bilməyəcəkdir, sadəcə müntəzəm Java bean kimi qəbul edir. Bu tələb dəyişirsə və təkcə baharda gördüyümüz kimi, tək nümunə bir prototip olsaydı, kodun xətti istehlakçıya dəyişdirilməyəcəksə, bu tamamilə dəyişdirilmədən edilə bilər.

Daha əvvəl sözügedən bir statik sinfi, məsələn, tamamilə prosedur olmalıdır. java.>

3
07 июня '12 в 4:07 2012-06-07 04:07 Cavab Chris tərəfindən 07 İyun 2012 günü saat 04:07 'da verildi. 2012-06-07 04:07
  • C # -də statik sinif bir interfeys tətbiq edə bilmir. Bir nümunə sinfi bir səbəbdən və ya bir hədəfdən istifadə etmək üçün bir interfeys tətbiq etməsi lazım olduqda, Singleton şablonunu statik bir sinif olmadan istifadə edə bilərsiniz.
  • Bir Singleton obyektini klonlaya bilərsiniz, lakin statik sinif obyekti klonlaya bilməzsiniz
  • Vahid obyektlər yığında saxlanılır, lakin statik obyektlər yığında saxlanılır
  • Sintaksis, sinxronizasiya və ya asinxronlaşdırıla bilər, statik sinif isə əvvəlcə ilk açılışda başlayır.
3
19 июня '16 в 6:14 2016-06-19 06:14 cavab akazemis tərəfindən 19 iyun '16, 6:14 2016-06-19 06:14 'də verilir

Yazdığım bir məqalədə, mən təklüyün statik bir sinifdən daha yaxşı olduğunu düşündüm.

  • Statik sinif, həqiqətən, bir kanonik sinif deyil - funksiyaları və dəyişənləri ilə ad sahəsi
  • Statik bir sinfi istifadə edərək, obyekt yönümlü proqramlaşdırma prinsiplərinin pozulduğu üçün yaxşı bir tətbiq deyil.
  • Statik sinif digər üçün parametr kimi qəbul edilə bilməz
  • Statik sinif tənbəl başlatma üçün uyğun deyil.
  • Statik sinifin başlanması və istifadəsi həmişə izlənilmək çətindir.
  • Akış nəzarətinin tətbiqi kompleksdir.
2
13 нояб. İstifadəçi tərəfindən verilən cavabı 13 Noyabr 13 2013-11-13 13:56 '13 at 13:56 2013-11-13 13:56

Aşağıdakıları oxuyuram və bunu da mənalı hiss edirəm:

Biznesin təşkili

OO-nun ən mühüm qaydalarından birinin obyektin özü üçün məsuliyyət olduğunu unutmayın. Bu, bir sinifin həyat dövrü ilə bağlı sualların sinifdə müzakirə edilməməsi və statik kimi dil konstruksiyalarına verilməməsi deməkdir.

"Obyektə Baxılan Düşüncə Davası" kitabından 4-cü ed.

2
31 дек. Cavab verilir 太極 者 無極 而 生 31 dekabr. 2015-12-31 00:05 '16 'da 0:05' da 2015-12-31 00:05

Bir müştəri baxımından, statik davranış müştəriyə məlumdur, lakin Singletonun davranışı müştəridən gizlənə bilər. Bir müştərinin heç vaxt təkrar-təkrar oynadığı bir nümunənin olduğunu bilir.

2
04 авг. Cavab Arpit Khandelwal 04 aug tərəfindən verilir . 2014-08-04 09:23 '14 at 9:23 AM 2014-08-04 09:23

a Serializasiya - statik üzvlər sinifə aiddir və buna görə də serializə edilə bilməz.

b. Xüsusi bir konstruktor etdik, baxmayaraq ki statik üzv dəyişənlər hələ bir alt sinifə köçürülür.

c. Hər şey sinif yükləndikdə yüklənəcəkdir, çünki tənbəl başlanğıc işlədir.

2
14 янв. Cavab Vivek Vermani tərəfindən verilir . 14 yanvar. 2014-01-14 20:46 '14 saat 20:46 2014-01-14 20:46

Əsas fərqlər:

  • Singleton bir nümunə / obyektə malikdir və statik bir sinif statik metoddur.
  • Singleton, statik bir sinif ola bilmədikdə, məsələn, interfeys vasitəsi ilə uzadıla bilər.
  • Singleton SOLID prinsiplərində açıq / bağlanma prinsiplərini dəstəkləyən miras ola bilər, digər tərəfdən, statik sinif miras alınamaz və biz özümüzü dəyişməliyik.
  • Bir singleton obyekti metodlara keçirilə bilər, statik sinif, bir nümunə olmadığı üçün parametrlər kimi qəbul edilə bilməz
2
28 апр. Faran Şabbir tərəfindən verilmiş cavab 28 aprel 2018-04-28 19:12 '18 saat 07:12 'də 2018-04-28 19:12

Sadə baxımdan, Singleton bir şablon deyil, bir söz deyil. Singleton şablonu statik dərslər üzərində bir sıra üstünlüklərə malikdir. Singleton, tətbiqin ömrü boyunca yalnız bir, daimi nümunə olan bir sinifə imkan verir. Bu, bir nümunə yaradılıb və bu instansiya (bu instansiya istinad) başqa metodlara parametr kimi qəbul edilə bilər və müntəzəm bir obyekt kimi qəbul edilə bilər. Хотя статический класс допускает только статические методы, и вы не можете передавать статический класс в качестве параметра. Узнайте больше о...... Синтаксический шаблон с статическим классом

Rj

1
03 дек. Cavab Rajesh 03 Dec tərəfindən verilir . '17 в 3:07 2017-12-03 03:07
  • Мы можем создать объект класса singleton и передать его методу.

  • Класс Singleton не имеет никакого ограничения наследования.

  • Мы не можем уничтожить объекты статического класса, но можем использовать одноэлементный класс.

1
ответ дан Sanjay Dwivedi 18 окт. '16 в 21:58 2016-10-18 21:58

Когда мне нужен класс с полной функциональностью, например. существует много методов и переменных, я использую singleton;

Если я хочу, чтобы класс содержал только один или два метода, например. Класс MailService, который имеет только 1 метод SendMail() Я использую статический класс и метод.

1
ответ дан Lev 28 мая '12 в 1:42 2012-05-28 01:42
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос